###############################################################################
# #
# IAR Assembler V5.30.1.50284/W32 for MSP430 15/Apr/2012 09:37:28 #
# Copyright 1996-2011 IAR Systems AB. #
# #
# Target option = MSP430 #
# Source file = C:\Dokumente und Einstellungen\All Users\Dokumente\CF430G2553\core430G2553.s43#
# List file = C:\Dokumente und Einstellungen\All Users\Dokumente\CF430G2553\Release0.34\List\core430G2553.lst#
# Object file = C:\Dokumente und Einstellungen\All Users\Dokumente\CF430G2553\Release0.34\Obj\core430G2553.r43#
# Command line = C:\Dokumente und Einstellungen\All Users\Dokumente\CF430G2553\core430G2553.s43 #
# -OC:\Dokumente und Einstellungen\All Users\Dokumente\CF430G2553\Release0.34\Obj\ #
# -s+ -M<> -w+ #
# -LC:\Dokumente und Einstellungen\All Users\Dokumente\CF430G2553\Release0.34\List\ #
# -i -t8 -x -r -D__MSP430G2553__ #
# -IC:\Programme\IAR Systems\Embedded Workbench 6.0 Kickstart\430\INC\ #
# #
###############################################################################
1 000000 ; ----------------------------------------------
------------------------
2 000000 ; CF430G2553 is a Forth based on CamelForth
3 000000 ; for the Texas Instruments MSP430
4 000000 ;
5 000000 ; This program is free software; you can
redistribute it and/or modify
6 000000 ; it under the terms of the GNU General Public
License as published by
7 000000 ; the Free Software Foundation; either version 3
of the License, or
8 000000 ; (at your option) any later version.
9 000000 ;
10 000000 ; This program is distributed in the hope that
it will be useful,
11 000000 ; but WITHOUT ANY WARRANTY; without even the
implied warranty of
12 000000 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the
13 000000 ; GNU General Public License for more details.
14 000000 ;
15 000000 ; You should have received a copy of the GNU
General Public License
16 000000 ; along with this program. If not, see
.
17 000000 ;
18 000000 ; See LICENSE TERMS in Brads file readme.txt as
well.
19 000000
20 000000 ; ----------------------------------------------
------------------------
21 000000 ; core430.s43 - Machine Language Primitives -
MSP430G2553
22 000000 ; ----------------------------------------------
------------------------
23 000000
24 000000 ; Revision History
25 000000 ; 1 mar 09 bjr - changed Flash write and erase
primitives to correctly
26 000000 ; write RAM outside Info Flash and Main
Flash address limits.
27 000000
28 000000 #include "msp430.h" ;
#define controlled include file
1 000000 /***********************************************
********************
2 000000 *
*
3 000000 * This file is a generic include file controlled
by *
4 000000 * compiler/assembler IDE generated defines
*
5 000000 *
*
6 000000 ************************************************
*******************/
7 000000
8 000000 #ifndef __msp430
9 000000 #define __msp430
10 000000
11 000000 #ifndef _SYSTEM_BUILD
12 000000 #pragma system_include
13 000000 #endif
14 000000
15 000000 #if defined (__MSP430C111__)
16 000000 #include "msp430c111.h"
18 000000 #elif defined (__MSP430C1111__)
19 000000 #include "msp430c1111.h"
21 000000 #elif defined (__MSP430C112__)
22 000000 #include "msp430c112.h"
24 000000 #elif defined (__MSP430C1121__)
25 000000 #include "msp430c1121.h"
27 000000 #elif defined (__MSP430C1331__)
28 000000 #include "msp430c1331.h"
30 000000 #elif defined (__MSP430C1351__)
31 000000 #include "msp430c1351.h"
33 000000 #elif defined (__MSP430C311S__)
34 000000 #include "msp430c311s.h"
36 000000 #elif defined (__MSP430C312__)
37 000000 #include "msp430c312.h"
39 000000 #elif defined (__MSP430C313__)
40 000000 #include "msp430c313.h"
42 000000 #elif defined (__MSP430C314__)
43 000000 #include "msp430c314.h"
45 000000 #elif defined (__MSP430C315__)
46 000000 #include "msp430c315.h"
48 000000 #elif defined (__MSP430C323__)
49 000000 #include "msp430c323.h"
51 000000 #elif defined (__MSP430C325__)
52 000000 #include "msp430c325.h"
54 000000 #elif defined (__MSP430C336__)
55 000000 #include "msp430c336.h"
57 000000 #elif defined (__MSP430C337__)
58 000000 #include "msp430c337.h"
60 000000 #elif defined (__MSP430C412__)
61 000000 #include "msp430c412.h"
63 000000 #elif defined (__MSP430C413__)
64 000000 #include "msp430c413.h"
66 000000 #elif defined (__MSP430CG4616__)
67 000000 #include "msp430cg4616.h"
69 000000 #elif defined (__MSP430CG4617__)
70 000000 #include "msp430cg4617.h"
72 000000 #elif defined (__MSP430CG4618__)
73 000000 #include "msp430cg4618.h"
75 000000 #elif defined (__MSP430CG4619__)
76 000000 #include "msp430cg4619.h"
78 000000 #elif defined (__MSP430E112__)
79 000000 #include "msp430e112.h"
81 000000 #elif defined (__MSP430E313__)
82 000000 #include "msp430e313.h"
84 000000 #elif defined (__MSP430E315__)
85 000000 #include "msp430e315.h"
87 000000 #elif defined (__MSP430E325__)
88 000000 #include "msp430e325.h"
90 000000 #elif defined (__MSP430E337__)
91 000000 #include "msp430e337.h"
93 000000 #elif defined (__MSP430F110__)
94 000000 #include "msp430f110.h"
96 000000 #elif defined (__MSP430F1101__)
97 000000 #include "msp430f1101.h"
99 000000 #elif defined (__MSP430F1101A__)
100 000000 #include "msp430f1101a.h"
102 000000 #elif defined (__MSP430F1111__)
103 000000 #include "msp430f1111.h"
105 000000 #elif defined (__MSP430F1111A__)
106 000000 #include "msp430f1111a.h"
108 000000 #elif defined (__MSP430F112__)
109 000000 #include "msp430f112.h"
111 000000 #elif defined (__MSP430F1121__)
112 000000 #include "msp430f1121.h"
114 000000 #elif defined (__MSP430F1121A__)
115 000000 #include "msp430f1121a.h"
117 000000 #elif defined (__MSP430F1122__)
118 000000 #include "msp430f1122.h"
120 000000 #elif defined (__MSP430F1132__)
121 000000 #include "msp430f1132.h"
123 000000 #elif defined (__MSP430F122__)
124 000000 #include "msp430f122.h"
126 000000 #elif defined (__MSP430F1222__)
127 000000 #include "msp430f1222.h"
129 000000 #elif defined (__MSP430F123__)
130 000000 #include "msp430f123.h"
132 000000 #elif defined (__MSP430F1232__)
133 000000 #include "msp430f1232.h"
135 000000 #elif defined (__MSP430F133__)
136 000000 #include "msp430f133.h"
138 000000 #elif defined (__MSP430F135__)
139 000000 #include "msp430f135.h"
141 000000 #elif defined (__MSP430F147__)
142 000000 #include "msp430f147.h"
144 000000 #elif defined (__MSP430F148__)
145 000000 #include "msp430f148.h"
147 000000 #elif defined (__MSP430F149__)
148 000000 #include "msp430f149.h"
150 000000 #elif defined (__MSP430F1471__)
151 000000 #include "msp430f1471.h"
153 000000 #elif defined (__MSP430F1481__)
154 000000 #include "msp430f1481.h"
156 000000 #elif defined (__MSP430F1491__)
157 000000 #include "msp430f1491.h"
159 000000 #elif defined (__MSP430F155__)
160 000000 #include "msp430f155.h"
162 000000 #elif defined (__MSP430F156__)
163 000000 #include "msp430f156.h"
165 000000 #elif defined (__MSP430F157__)
166 000000 #include "msp430f157.h"
168 000000 #elif defined (__MSP430F167__)
169 000000 #include "msp430f167.h"
171 000000 #elif defined (__MSP430F168__)
172 000000 #include "msp430f168.h"
174 000000 #elif defined (__MSP430F169__)
175 000000 #include "msp430f169.h"
177 000000 #elif defined (__MSP430F1610__)
178 000000 #include "msp430f1610.h"
180 000000 #elif defined (__MSP430F1611__)
181 000000 #include "msp430f1611.h"
183 000000 #elif defined (__MSP430F1612__)
184 000000 #include "msp430f1612.h"
186 000000 #elif defined (__MSP430F2001__)
187 000000 #include "msp430f2001.h"
189 000000 #elif defined (__MSP430F2011__)
190 000000 #include "msp430f2011.h"
192 000000 #elif defined (__MSP430F2002__)
193 000000 #include "msp430f2002.h"
195 000000 #elif defined (__MSP430F2012__)
196 000000 #include "msp430f2012.h"
198 000000 #elif defined (__MSP430F2003__)
199 000000 #include "msp430f2003.h"
201 000000 #elif defined (__MSP430F2013__)
202 000000 #include "msp430f2013.h"
204 000000 #elif defined (__MSP430F2101__)
205 000000 #include "msp430f2101.h"
207 000000 #elif defined (__MSP430F2111__)
208 000000 #include "msp430f2111.h"
210 000000 #elif defined (__MSP430F2121__)
211 000000 #include "msp430f2121.h"
213 000000 #elif defined (__MSP430F2131__)
214 000000 #include "msp430f2131.h"
216 000000 #elif defined (__MSP430F2112__)
217 000000 #include "msp430f2112.h"
219 000000 #elif defined (__MSP430F2122__)
220 000000 #include "msp430f2122.h"
222 000000 #elif defined (__MSP430F2132__)
223 000000 #include "msp430f2132.h"
225 000000 #elif defined (__MSP430F2232__)
226 000000 #include "msp430f2232.h"
228 000000 #elif defined (__MSP430F2252__)
229 000000 #include "msp430f2252.h"
231 000000 #elif defined (__MSP430F2272__)
232 000000 #include "msp430f2272.h"
234 000000 #elif defined (__MSP430F2234__)
235 000000 #include "msp430f2234.h"
237 000000 #elif defined (__MSP430F2254__)
238 000000 #include "msp430f2254.h"
240 000000 #elif defined (__MSP430F2274__)
241 000000 #include "msp430f2274.h"
243 000000 #elif defined (__MSP430F2330__)
244 000000 #include "msp430f2330.h"
246 000000 #elif defined (__MSP430F2350__)
247 000000 #include "msp430f2350.h"
249 000000 #elif defined (__MSP430F2370__)
250 000000 #include "msp430f2370.h"
252 000000 #elif defined (__MSP430F233__)
253 000000 #include "msp430f233.h"
255 000000 #elif defined (__MSP430F235__)
256 000000 #include "msp430f235.h"
258 000000 #elif defined (__MSP430F247__)
259 000000 #include "msp430f247.h"
261 000000 #elif defined (__MSP430F248__)
262 000000 #include "msp430f248.h"
264 000000 #elif defined (__MSP430F249__)
265 000000 #include "msp430f249.h"
267 000000 #elif defined (__MSP430F2410__)
268 000000 #include "msp430f2410.h"
270 000000 #elif defined (__MSP430F2471__)
271 000000 #include "msp430f2471.h"
273 000000 #elif defined (__MSP430F2481__)
274 000000 #include "msp430f2481.h"
276 000000 #elif defined (__MSP430F2491__)
277 000000 #include "msp430f2491.h"
279 000000 #elif defined (__MSP430F2416__)
280 000000 #include "msp430f2416.h"
282 000000 #elif defined (__MSP430F2417__)
283 000000 #include "msp430f2417.h"
285 000000 #elif defined (__MSP430F2418__)
286 000000 #include "msp430f2418.h"
288 000000 #elif defined (__MSP430F2419__)
289 000000 #include "msp430f2419.h"
291 000000 #elif defined (__MSP430F2616__)
292 000000 #include "msp430f2616.h"
294 000000 #elif defined (__MSP430F2617__)
295 000000 #include "msp430f2617.h"
297 000000 #elif defined (__MSP430F2618__)
298 000000 #include "msp430f2618.h"
300 000000 #elif defined (__MSP430F2619__)
301 000000 #include "msp430f2619.h"
303 000000 #elif defined (__MSP430F412__)
304 000000 #include "msp430f412.h"
306 000000 #elif defined (__MSP430F413__)
307 000000 #include "msp430f413.h"
309 000000 #elif defined (__MSP430F415__)
310 000000 #include "msp430f415.h"
312 000000 #elif defined (__MSP430F417__)
313 000000 #include "msp430f417.h"
315 000000 #elif defined (__MSP430F4132__)
316 000000 #include "msp430f4132.h"
318 000000 #elif defined (__MSP430F4152__)
319 000000 #include "msp430f4152.h"
321 000000 #elif defined (__MSP430F423__)
322 000000 #include "msp430f423.h"
324 000000 #elif defined (__MSP430F425__)
325 000000 #include "msp430f425.h"
327 000000 #elif defined (__MSP430F427__)
328 000000 #include "msp430f427.h"
330 000000 #elif defined (__MSP430F423A__)
331 000000 #include "msp430f423a.h"
333 000000 #elif defined (__MSP430F425A__)
334 000000 #include "msp430f425a.h"
336 000000 #elif defined (__MSP430F427A__)
337 000000 #include "msp430f427a.h"
339 000000 #elif defined (__MSP430F435__)
340 000000 #include "msp430f435.h"
342 000000 #elif defined (__MSP430F436__)
343 000000 #include "msp430f436.h"
345 000000 #elif defined (__MSP430F437__)
346 000000 #include "msp430f437.h"
348 000000 #elif defined (__MSP430F4351__)
349 000000 #include "msp430f4351.h"
351 000000 #elif defined (__MSP430F4361__)
352 000000 #include "msp430f4361.h"
354 000000 #elif defined (__MSP430F4371__)
355 000000 #include "msp430f4371.h"
357 000000 #elif defined (__MSP430F4481__)
358 000000 #include "msp430f4481.h"
360 000000 #elif defined (__MSP430F4491__)
361 000000 #include "msp430f4491.h"
363 000000 #elif defined (__MSP430F447__)
364 000000 #include "msp430f447.h"
366 000000 #elif defined (__MSP430F448__)
367 000000 #include "msp430f448.h"
369 000000 #elif defined (__MSP430F449__)
370 000000 #include "msp430f449.h"
372 000000 #elif defined (__MSP430FE423__)
373 000000 #include "msp430fe423.h"
375 000000 #elif defined (__MSP430FE425__)
376 000000 #include "msp430fe425.h"
378 000000 #elif defined (__MSP430FE427__)
379 000000 #include "msp430fe427.h"
381 000000 #elif defined (__MSP430FE423A__)
382 000000 #include "msp430fe423a.h"
384 000000 #elif defined (__MSP430FE425A__)
385 000000 #include "msp430fe425a.h"
387 000000 #elif defined (__MSP430FE427A__)
388 000000 #include "msp430fe427a.h"
390 000000 #elif defined (__MSP430FE4232__)
391 000000 #include "msp430fe4232.h"
393 000000 #elif defined (__MSP430FE4242__)
394 000000 #include "msp430fe4242.h"
396 000000 #elif defined (__MSP430FE4252__)
397 000000 #include "msp430fe4252.h"
399 000000 #elif defined (__MSP430FE4272__)
400 000000 #include "msp430fe4272.h"
402 000000 #elif defined (__MSP430F4783__)
403 000000 #include "msp430f4783.h"
405 000000 #elif defined (__MSP430F4793__)
406 000000 #include "msp430f4793.h"
408 000000 #elif defined (__MSP430F4784__)
409 000000 #include "msp430f4784.h"
411 000000 #elif defined (__MSP430F4794__)
412 000000 #include "msp430f4794.h"
414 000000 #elif defined (__MSP430F47126__)
415 000000 #include "msp430f47126.h"
417 000000 #elif defined (__MSP430F47127__)
418 000000 #include "msp430f47127.h"
420 000000 #elif defined (__MSP430F47163__)
421 000000 #include "msp430f47163.h"
423 000000 #elif defined (__MSP430F47173__)
424 000000 #include "msp430f47173.h"
426 000000 #elif defined (__MSP430F47183__)
427 000000 #include "msp430f47183.h"
429 000000 #elif defined (__MSP430F47193__)
430 000000 #include "msp430f47193.h"
432 000000 #elif defined (__MSP430F47166__)
433 000000 #include "msp430f47166.h"
435 000000 #elif defined (__MSP430F47176__)
436 000000 #include "msp430f47176.h"
438 000000 #elif defined (__MSP430F47186__)
439 000000 #include "msp430f47186.h"
441 000000 #elif defined (__MSP430F47196__)
442 000000 #include "msp430f47196.h"
444 000000 #elif defined (__MSP430F47167__)
445 000000 #include "msp430f47167.h"
447 000000 #elif defined (__MSP430F47177__)
448 000000 #include "msp430f47177.h"
450 000000 #elif defined (__MSP430F47187__)
451 000000 #include "msp430f47187.h"
453 000000 #elif defined (__MSP430F47197__)
454 000000 #include "msp430f47197.h"
456 000000 #elif defined (__MSP430F4250__)
457 000000 #include "msp430f4250.h"
459 000000 #elif defined (__MSP430F4260__)
460 000000 #include "msp430f4260.h"
462 000000 #elif defined (__MSP430F4270__)
463 000000 #include "msp430f4270.h"
465 000000 #elif defined (__MSP430FG4250__)
466 000000 #include "msp430fg4250.h"
468 000000 #elif defined (__MSP430FG4260__)
469 000000 #include "msp430fg4260.h"
471 000000 #elif defined (__MSP430FG4270__)
472 000000 #include "msp430fg4270.h"
474 000000 #elif defined (__MSP430FW423__)
475 000000 #include "msp430fw423.h"
477 000000 #elif defined (__MSP430FW425__)
478 000000 #include "msp430fw425.h"
480 000000 #elif defined (__MSP430FW427__)
481 000000 #include "msp430fw427.h"
483 000000 #elif defined (__MSP430FW428__)
484 000000 #include "msp430fw428.h"
486 000000 #elif defined (__MSP430FW429__)
487 000000 #include "msp430fw429.h"
489 000000 #elif defined (__MSP430FG437__)
490 000000 #include "msp430fg437.h"
492 000000 #elif defined (__MSP430FG438__)
493 000000 #include "msp430fg438.h"
495 000000 #elif defined (__MSP430FG439__)
496 000000 #include "msp430fg439.h"
498 000000 #elif defined (__MSP430F438__)
499 000000 #include "msp430f438.h"
501 000000 #elif defined (__MSP430F439__)
502 000000 #include "msp430f439.h"
504 000000 #elif defined (__MSP430F477__)
505 000000 #include "msp430f477.h"
507 000000 #elif defined (__MSP430F478__)
508 000000 #include "msp430f478.h"
510 000000 #elif defined (__MSP430F479__)
511 000000 #include "msp430f479.h"
513 000000 #elif defined (__MSP430FG477__)
514 000000 #include "msp430fg477.h"
516 000000 #elif defined (__MSP430FG478__)
517 000000 #include "msp430fg478.h"
519 000000 #elif defined (__MSP430FG479__)
520 000000 #include "msp430fg479.h"
522 000000 #elif defined (__MSP430F46161__)
523 000000 #include "msp430f46161.h"
525 000000 #elif defined (__MSP430F46171__)
526 000000 #include "msp430f46171.h"
528 000000 #elif defined (__MSP430F46181__)
529 000000 #include "msp430f46181.h"
531 000000 #elif defined (__MSP430F46191__)
532 000000 #include "msp430f46191.h"
534 000000 #elif defined (__MSP430F4616__)
535 000000 #include "msp430f4616.h"
537 000000 #elif defined (__MSP430F4617__)
538 000000 #include "msp430f4617.h"
540 000000 #elif defined (__MSP430F4618__)
541 000000 #include "msp430f4618.h"
543 000000 #elif defined (__MSP430F4619__)
544 000000 #include "msp430f4619.h"
546 000000 #elif defined (__MSP430FG4616__)
547 000000 #include "msp430fg4616.h"
549 000000 #elif defined (__MSP430FG4617__)
550 000000 #include "msp430fg4617.h"
552 000000 #elif defined (__MSP430FG4618__)
553 000000 #include "msp430fg4618.h"
555 000000 #elif defined (__MSP430FG4619__)
556 000000 #include "msp430fg4619.h"
558 000000 #elif defined (__MSP430F5418__)
559 000000 #include "msp430f5418.h"
561 000000 #elif defined (__MSP430F5419__)
562 000000 #include "msp430f5419.h"
564 000000 #elif defined (__MSP430F5435__)
565 000000 #include "msp430f5435.h"
567 000000 #elif defined (__MSP430F5436__)
568 000000 #include "msp430f5436.h"
570 000000 #elif defined (__MSP430F5437__)
571 000000 #include "msp430f5437.h"
573 000000 #elif defined (__MSP430F5438__)
574 000000 #include "msp430f5438.h"
576 000000 #elif defined (__XMS430F5438__)
577 000000 #include "xms430f5438.h"
579 000000 #elif defined (__MSP430F5418A__)
580 000000 #include "msp430f5418a.h"
582 000000 #elif defined (__MSP430F5419A__)
583 000000 #include "msp430f5419a.h"
585 000000 #elif defined (__MSP430F5435A__)
586 000000 #include "msp430f5435a.h"
588 000000 #elif defined (__MSP430F5436A__)
589 000000 #include "msp430f5436a.h"
591 000000 #elif defined (__MSP430F5437A__)
592 000000 #include "msp430f5437a.h"
594 000000 #elif defined (__MSP430F5438A__)
595 000000 #include "msp430f5438a.h"
597 000000 #elif defined (__MSP430F5304__)
598 000000 #include "msp430f5304.h"
600 000000 #elif defined (__MSP430F5308__)
601 000000 #include "msp430f5308.h"
603 000000 #elif defined (__MSP430F5309__)
604 000000 #include "msp430f5309.h"
606 000000 #elif defined (__MSP430F5310__)
607 000000 #include "msp430f5310.h"
609 000000 #elif defined (__MSP430F5340__)
610 000000 #include "msp430f5340.h"
612 000000 #elif defined (__MSP430F5341__)
613 000000 #include "msp430f5341.h"
615 000000 #elif defined (__MSP430F5342__)
616 000000 #include "msp430f5342.h"
618 000000 #elif defined (__MSP430F5324__)
619 000000 #include "msp430f5324.h"
621 000000 #elif defined (__MSP430F5325__)
622 000000 #include "msp430f5325.h"
624 000000 #elif defined (__MSP430F5326__)
625 000000 #include "msp430f5326.h"
627 000000 #elif defined (__MSP430F5327__)
628 000000 #include "msp430f5327.h"
630 000000 #elif defined (__MSP430F5328__)
631 000000 #include "msp430f5328.h"
633 000000 #elif defined (__MSP430F5329__)
634 000000 #include "msp430f5329.h"
636 000000 #elif defined (__MSP430F5500__)
637 000000 #include "msp430f5500.h"
639 000000 #elif defined (__MSP430F5501__)
640 000000 #include "msp430f5501.h"
642 000000 #elif defined (__MSP430F5502__)
643 000000 #include "msp430f5502.h"
645 000000 #elif defined (__MSP430F5503__)
646 000000 #include "msp430f5503.h"
648 000000 #elif defined (__MSP430F5504__)
649 000000 #include "msp430f5504.h"
651 000000 #elif defined (__MSP430F5505__)
652 000000 #include "msp430f5505.h"
654 000000 #elif defined (__MSP430F5506__)
655 000000 #include "msp430f5506.h"
657 000000 #elif defined (__MSP430F5507__)
658 000000 #include "msp430f5507.h"
660 000000 #elif defined (__MSP430F5508__)
661 000000 #include "msp430f5508.h"
663 000000 #elif defined (__MSP430F5509__)
664 000000 #include "msp430f5509.h"
666 000000 #elif defined (__MSP430F5510__)
667 000000 #include "msp430f5510.h"
669 000000 #elif defined (__MSP430F5513__)
670 000000 #include "msp430f5513.h"
672 000000 #elif defined (__MSP430F5514__)
673 000000 #include "msp430f5514.h"
675 000000 #elif defined (__MSP430F5515__)
676 000000 #include "msp430f5515.h"
678 000000 #elif defined (__MSP430F5517__)
679 000000 #include "msp430f5517.h"
681 000000 #elif defined (__MSP430F5519__)
682 000000 #include "msp430f5519.h"
684 000000 #elif defined (__MSP430F5521__)
685 000000 #include "msp430f5521.h"
687 000000 #elif defined (__MSP430F5522__)
688 000000 #include "msp430f5522.h"
690 000000 #elif defined (__MSP430F5524__)
691 000000 #include "msp430f5524.h"
693 000000 #elif defined (__MSP430F5525__)
694 000000 #include "msp430f5525.h"
696 000000 #elif defined (__MSP430F5526__)
697 000000 #include "msp430f5526.h"
699 000000 #elif defined (__MSP430F5527__)
700 000000 #include "msp430f5527.h"
702 000000 #elif defined (__MSP430F5528__)
703 000000 #include "msp430f5528.h"
705 000000 #elif defined (__MSP430F5529__)
706 000000 #include "msp430f5529.h"
708 000000 #elif defined (__MSP430P112__)
709 000000 #include "msp430p112.h"
711 000000 #elif defined (__MSP430P313__)
712 000000 #include "msp430p313.h"
714 000000 #elif defined (__MSP430P315__)
715 000000 #include "msp430p315.h"
717 000000 #elif defined (__MSP430P315S__)
718 000000 #include "msp430p315s.h"
720 000000 #elif defined (__MSP430P325__)
721 000000 #include "msp430p325.h"
723 000000 #elif defined (__MSP430P337__)
724 000000 #include "msp430p337.h"
726 000000 #elif defined (__CC430F5133__)
727 000000 #include "cc430f5133.h"
729 000000 #elif defined (__CC430F5135__)
730 000000 #include "cc430f5135.h"
732 000000 #elif defined (__CC430F5137__)
733 000000 #include "cc430f5137.h"
735 000000 #elif defined (__CC430F6125__)
736 000000 #include "cc430f6125.h"
738 000000 #elif defined (__CC430F6126__)
739 000000 #include "cc430f6126.h"
741 000000 #elif defined (__CC430F6127__)
742 000000 #include "cc430f6127.h"
744 000000 #elif defined (__CC430F6135__)
745 000000 #include "cc430f6135.h"
747 000000 #elif defined (__CC430F6137__)
748 000000 #include "cc430f6137.h"
750 000000 #elif defined (__MSP430F5630__)
751 000000 #include "msp430f5630.h"
753 000000 #elif defined (__MSP430F5631__)
754 000000 #include "msp430f5631.h"
756 000000 #elif defined (__MSP430F5632__)
757 000000 #include "msp430f5632.h"
759 000000 #elif defined (__MSP430F5633__)
760 000000 #include "msp430f5633.h"
762 000000 #elif defined (__MSP430F5634__)
763 000000 #include "msp430f5634.h"
765 000000 #elif defined (__MSP430F5635__)
766 000000 #include "msp430f5635.h"
768 000000 #elif defined (__MSP430F5636__)
769 000000 #include "msp430f5636.h"
771 000000 #elif defined (__MSP430F5637__)
772 000000 #include "msp430f5637.h"
774 000000 #elif defined (__MSP430F5638__)
775 000000 #include "msp430f5638.h"
777 000000 #elif defined (__MSP430F6630__)
778 000000 #include "msp430f6630.h"
780 000000 #elif defined (__MSP430F6631__)
781 000000 #include "msp430f6631.h"
783 000000 #elif defined (__MSP430F6632__)
784 000000 #include "msp430f6632.h"
786 000000 #elif defined (__MSP430F6633__)
787 000000 #include "msp430f6633.h"
789 000000 #elif defined (__MSP430F6634__)
790 000000 #include "msp430f6634.h"
792 000000 #elif defined (__MSP430F6635__)
793 000000 #include "msp430f6635.h"
795 000000 #elif defined (__MSP430F6636__)
796 000000 #include "msp430f6636.h"
798 000000 #elif defined (__MSP430F6637__)
799 000000 #include "msp430f6637.h"
801 000000 #elif defined (__MSP430F6638__)
802 000000 #include "msp430f6638.h"
804 000000 #elif defined (__MSP430L092__)
805 000000 #include "msp430l092.h"
807 000000 #elif defined (__MSP430C091__)
808 000000 #include "msp430c091.h"
810 000000 #elif defined (__MSP430C092__)
811 000000 #include "msp430c092.h"
813 000000 #elif defined (__MSP430F5131__)
814 000000 #include "msp430f5131.h"
816 000000 #elif defined (__MSP430F5151__)
817 000000 #include "msp430f5151.h"
819 000000 #elif defined (__MSP430F5171__)
820 000000 #include "msp430f5171.h"
822 000000 #elif defined (__MSP430F5132__)
823 000000 #include "msp430f5132.h"
825 000000 #elif defined (__MSP430F5152__)
826 000000 #include "msp430f5152.h"
828 000000 #elif defined (__MSP430F5172__)
829 000000 #include "msp430f5172.h"
831 000000 #elif defined (__MSP430FR5720__)
832 000000 #include "msp430fr5720.h"
834 000000 #elif defined (__MSP430FR5725__)
835 000000 #include "msp430fr5725.h"
837 000000 #elif defined (__MSP430FR5728__)
838 000000 #include "msp430fr5728.h"
840 000000 #elif defined (__MSP430FR5729__)
841 000000 #include "msp430fr5729.h"
843 000000 #elif defined (__MSP430FR5730__)
844 000000 #include "msp430fr5730.h"
846 000000 #elif defined (__MSP430FR5735__)
847 000000 #include "msp430fr5735.h"
849 000000 #elif defined (__MSP430FR5738__)
850 000000 #include "msp430fr5738.h"
852 000000 #elif defined (__MSP430FR5739__)
853 000000 #include "msp430fr5739.h"
855 000000 #elif defined (__MSP430G2211__)
856 000000 #include "msp430g2211.h"
858 000000 #elif defined (__MSP430G2201__)
859 000000 #include "msp430g2201.h"
861 000000 #elif defined (__MSP430G2111__)
862 000000 #include "msp430g2111.h"
864 000000 #elif defined (__MSP430G2101__)
865 000000 #include "msp430g2101.h"
867 000000 #elif defined (__MSP430G2001__)
868 000000 #include "msp430g2001.h"
870 000000 #elif defined (__MSP430G2231__)
871 000000 #include "msp430g2231.h"
873 000000 #elif defined (__MSP430G2221__)
874 000000 #include "msp430g2221.h"
876 000000 #elif defined (__MSP430G2131__)
877 000000 #include "msp430g2131.h"
879 000000 #elif defined (__MSP430G2121__)
880 000000 #include "msp430g2121.h"
882 000000 #elif defined (__MSP430AFE221__)
883 000000 #include "msp430afe221.h"
885 000000 #elif defined (__MSP430AFE231__)
886 000000 #include "msp430afe231.h"
888 000000 #elif defined (__MSP430AFE251__)
889 000000 #include "msp430afe251.h"
891 000000 #elif defined (__MSP430AFE222__)
892 000000 #include "msp430afe222.h"
894 000000 #elif defined (__MSP430AFE232__)
895 000000 #include "msp430afe232.h"
897 000000 #elif defined (__MSP430AFE252__)
898 000000 #include "msp430afe252.h"
900 000000 #elif defined (__MSP430AFE223__)
901 000000 #include "msp430afe223.h"
903 000000 #elif defined (__MSP430AFE233__)
904 000000 #include "msp430afe233.h"
906 000000 #elif defined (__MSP430AFE253__)
907 000000 #include "msp430afe253.h"
909 000000 #elif defined (__MSP430G2102__)
910 000000 #include "msp430g2102.h"
912 000000 #elif defined (__MSP430G2202__)
913 000000 #include "msp430g2202.h"
915 000000 #elif defined (__MSP430G2302__)
916 000000 #include "msp430g2302.h"
918 000000 #elif defined (__MSP430G2402__)
919 000000 #include "msp430g2402.h"
921 000000 #elif defined (__MSP430G2132__)
922 000000 #include "msp430g2132.h"
924 000000 #elif defined (__MSP430G2232__)
925 000000 #include "msp430g2232.h"
927 000000 #elif defined (__MSP430G2332__)
928 000000 #include "msp430g2332.h"
930 000000 #elif defined (__MSP430G2432__)
931 000000 #include "msp430g2432.h"
933 000000 #elif defined (__MSP430G2112__)
934 000000 #include "msp430g2112.h"
936 000000 #elif defined (__MSP430G2212__)
937 000000 #include "msp430g2212.h"
939 000000 #elif defined (__MSP430G2312__)
940 000000 #include "msp430g2312.h"
942 000000 #elif defined (__MSP430G2412__)
943 000000 #include "msp430g2412.h"
945 000000 #elif defined (__MSP430G2152__)
946 000000 #include "msp430g2152.h"
948 000000 #elif defined (__MSP430G2252__)
949 000000 #include "msp430g2252.h"
951 000000 #elif defined (__MSP430G2352__)
952 000000 #include "msp430g2352.h"
954 000000 #elif defined (__MSP430G2452__)
955 000000 #include "msp430g2452.h"
957 000000 #elif defined (__MSP430G2113__)
958 000000 #include "msp430g2113.h"
960 000000 #elif defined (__MSP430G2213__)
961 000000 #include "msp430g2213.h"
963 000000 #elif defined (__MSP430G2313__)
964 000000 #include "msp430g2313.h"
966 000000 #elif defined (__MSP430G2413__)
967 000000 #include "msp430g2413.h"
969 000000 #elif defined (__MSP430G2513__)
970 000000 #include "msp430g2513.h"
972 000000 #elif defined (__MSP430G2153__)
973 000000 #include "msp430g2153.h"
975 000000 #elif defined (__MSP430G2253__)
976 000000 #include "msp430g2253.h"
978 000000 #elif defined (__MSP430G2353__)
979 000000 #include "msp430g2353.h"
981 000000 #elif defined (__MSP430G2453__)
982 000000 #include "msp430g2453.h"
984 000000 #elif defined (__MSP430G2553__)
985 000000 #include "msp430g2553.h"
1 000000 /***********************************************
*********************
2 000000 *
3 000000 * Standard register and bit definitions for the
Texas Instruments
4 000000 * MSP430 microcontroller.
5 000000 *
6 000000 * This file supports assembler and C development
for
7 000000 * MSP430G2553 devices.
8 000000 *
9 000000 * Texas Instruments, Version 1.0
10 000000 *
11 000000 * Rev. 1.0, Setup
12 000000 *
13 000000 ************************************************
********************/
14 000000
15 000000 #ifndef __MSP430G2553
16 000000 #define __MSP430G2553
17 000000
18 000000 #ifdef __IAR_SYSTEMS_ICC__
19 000000 #ifndef _SYSTEM_BUILD
20 000000 #pragma system_include
21 000000 #endif
22 000000 #endif
23 000000
24 000000 #if (((__TID__ >> 8) & 0x7F) != 0x2b) /*
0x2b = 43 dec */
25 000000 #error msp430g2553.h file for use with
ICC430/A430 only
26 000000 #endif
27 000000
28 000000
29 000000 #ifdef __IAR_SYSTEMS_ICC__
30 000000 #include "in430.h"
31 000000 #pragma language=extended
33 000000 #define DEFC(name, address) __no_init volatile
unsigned char name @ address;
34 000000 #define DEFW(name, address) __no_init volatile
unsigned short name @ address;
35 000000 #define DEFXC volatile unsigned char
36 000000 #define DEFXW volatile unsigned short
38 000000 #endif /* __IAR_SYSTEMS_ICC__ */
39 000000
40 000000
41 000000 #ifdef __IAR_SYSTEMS_ASM__
42 000000 #define DEFC(name, address) sfrb name =
address;
43 000000 #define DEFW(name, address) sfrw name =
address;
44 000000
45 000000 #endif /* __IAR_SYSTEMS_ASM__*/
46 000000
47 000000 #ifdef __cplusplus
48 000000 #define READ_ONLY
49 000000 #else
50 000000 #define READ_ONLY const
51 000000 #endif
52 000000
53 000000 /***********************************************
*************
54 000000 * STANDARD BITS
55 000000 ************************************************
************/
56 000000
57 000000 #define BIT0 (0x0001u)
58 000000 #define BIT1 (0x0002u)
59 000000 #define BIT2 (0x0004u)
60 000000 #define BIT3 (0x0008u)
61 000000 #define BIT4 (0x0010u)
62 000000 #define BIT5 (0x0020u)
63 000000 #define BIT6 (0x0040u)
64 000000 #define BIT7 (0x0080u)
65 000000 #define BIT8 (0x0100u)
66 000000 #define BIT9 (0x0200u)
67 000000 #define BITA (0x0400u)
68 000000 #define BITB (0x0800u)
69 000000 #define BITC (0x1000u)
70 000000 #define BITD (0x2000u)
71 000000 #define BITE (0x4000u)
72 000000 #define BITF (0x8000u)
73 000000
74 000000 /***********************************************
*************
75 000000 * STATUS REGISTER BITS
76 000000 ************************************************
************/
77 000000
78 000000 #define C (0x0001u)
79 000000 #define Z (0x0002u)
80 000000 #define N (0x0004u)
81 000000 #define V (0x0100u)
82 000000 #define GIE (0x0008u)
83 000000 #define CPUOFF (0x0010u)
84 000000 #define OSCOFF (0x0020u)
85 000000 #define SCG0 (0x0040u)
86 000000 #define SCG1 (0x0080u)
87 000000
88 000000 /* Low Power Modes coded with Bits 4-7 in SR
*/
89 000000
90 000000 #ifndef __IAR_SYSTEMS_ICC__ /* Begin #defines
for assembler */
91 000000 #define LPM0 (CPUOFF)
92 000000 #define LPM1 (SCG0+CPUOFF)
93 000000 #define LPM2 (SCG1+CPUOFF)
94 000000 #define LPM3 (SCG1+SCG0+CPUOFF)
95 000000 #define LPM4 (SCG1+SCG0+OSCOFF+CP
UOFF)
96 000000 /* End #defines for assembler */
97 000000
98 000000 #else /* Begin #defines for C */
99 000000 #define LPM0_bits (CPUOFF)
100 000000 #define LPM1_bits (SCG0+CPUOFF)
101 000000 #define LPM2_bits (SCG1+CPUOFF)
102 000000 #define LPM3_bits (SCG1+SCG0+CPUOFF)
103 000000 #define LPM4_bits (SCG1+SCG0+OSCOFF+CP
UOFF)
105 000000 #include "in430.h"
107 000000 #define LPM0 _BIS_SR(LPM0_bits) /*
Enter Low Power Mode 0 */
108 000000 #define LPM0_EXIT _BIC_SR_IRQ(LPM0_bits) /* Exit
Low Power Mode 0 */
109 000000 #define LPM1 _BIS_SR(LPM1_bits) /*
Enter Low Power Mode 1 */
110 000000 #define LPM1_EXIT _BIC_SR_IRQ(LPM1_bits) /* Exit
Low Power Mode 1 */
111 000000 #define LPM2 _BIS_SR(LPM2_bits) /*
Enter Low Power Mode 2 */
112 000000 #define LPM2_EXIT _BIC_SR_IRQ(LPM2_bits) /* Exit
Low Power Mode 2 */
113 000000 #define LPM3 _BIS_SR(LPM3_bits) /*
Enter Low Power Mode 3 */
114 000000 #define LPM3_EXIT _BIC_SR_IRQ(LPM3_bits) /* Exit
Low Power Mode 3 */
115 000000 #define LPM4 _BIS_SR(LPM4_bits) /*
Enter Low Power Mode 4 */
116 000000 #define LPM4_EXIT _BIC_SR_IRQ(LPM4_bits) /* Exit
Low Power Mode 4 */
117 000000 #endif /* End #defines for C */
118 000000
119 000000 /***********************************************
*************
120 000000 * PERIPHERAL FILE MAP
121 000000 ************************************************
************/
122 000000
123 000000 /***********************************************
*************
124 000000 * SPECIAL FUNCTION REGISTER ADDRESSES + CONTROL
BITS
125 000000 ************************************************
************/
126 000000
127 000000 #define IE1_ (0x0000u) /*
Interrupt Enable 1 */
128 000000 DEFC( IE1 , IE1_)
129 000000 #define WDTIE (0x01) /*
Watchdog Interrupt Enable */
130 000000 #define OFIE (0x02) /* Osc.
Fault Interrupt Enable */
131 000000 #define NMIIE (0x10) /* NMI
Interrupt Enable */
132 000000 #define ACCVIE (0x20) /* Flash
Access Violation Interrupt Enable */
133 000000
134 000000 #define IFG1_ (0x0002u) /*
Interrupt Flag 1 */
135 000000 DEFC( IFG1 , IFG1_)
136 000000 #define WDTIFG (0x01) /*
Watchdog Interrupt Flag */
137 000000 #define OFIFG (0x02) /* Osc.
Fault Interrupt Flag */
138 000000 #define PORIFG (0x04) /* Power
On Interrupt Flag */
139 000000 #define RSTIFG (0x08) /* Reset
Interrupt Flag */
140 000000 #define NMIIFG (0x10) /* NMI
Interrupt Flag */
141 000000
142 000000 #define IE2_ (0x0001u) /*
Interrupt Enable 2 */
143 000000 DEFC( IE2 , IE2_)
144 000000 #define UC0IE IE2
145 000000 #define UCA0RXIE (0x01)
146 000000 #define UCA0TXIE (0x02)
147 000000 #define UCB0RXIE (0x04)
148 000000 #define UCB0TXIE (0x08)
149 000000
150 000000 #define IFG2_ (0x0003u) /*
Interrupt Flag 2 */
151 000000 DEFC( IFG2 , IFG2_)
152 000000 #define UC0IFG IFG2
153 000000 #define UCA0RXIFG (0x01)
154 000000 #define UCA0TXIFG (0x02)
155 000000 #define UCB0RXIFG (0x04)
156 000000 #define UCB0TXIFG (0x08)
157 000000
158 000000 /***********************************************
*************
159 000000 * ADC10
160 000000 ************************************************
************/
161 000000 #define __MSP430_HAS_ADC10__ /*
Definition to show that Module is available
*/
162 000000
163 000000 #define ADC10DTC0_ (0x0048u) /*
ADC10 Data Transfer Control 0 */
164 000000 DEFC( ADC10DTC0 , ADC10DTC0_)
165 000000 #define ADC10DTC1_ (0x0049u) /*
ADC10 Data Transfer Control 1 */
166 000000 DEFC( ADC10DTC1 , ADC10DTC1_)
167 000000 #define ADC10AE0_ (0x004Au) /*
ADC10 Analog Enable 0 */
168 000000 DEFC( ADC10AE0 , ADC10AE0_)
169 000000
170 000000 #define ADC10CTL0_ (0x01B0u) /*
ADC10 Control 0 */
171 000000 DEFW( ADC10CTL0 , ADC10CTL0_)
172 000000 #define ADC10CTL1_ (0x01B2u) /*
ADC10 Control 1 */
173 000000 DEFW( ADC10CTL1 , ADC10CTL1_)
174 000000 #define ADC10MEM_ (0x01B4u) /*
ADC10 Memory */
175 000000 DEFW( ADC10MEM , ADC10MEM_)
176 000000 #define ADC10SA_ (0x01BCu) /*
ADC10 Data Transfer Start Address */
177 000000 DEFW( ADC10SA , ADC10SA_)
178 000000
179 000000 /* ADC10CTL0 */
180 000000 #define ADC10SC (0x001) /* ADC10
Start Conversion */
181 000000 #define ENC (0x002) /* ADC10
Enable Conversion */
182 000000 #define ADC10IFG (0x004) /* ADC10
Interrupt Flag */
183 000000 #define ADC10IE (0x008) /* ADC10
Interrupt Enalbe */
184 000000 #define ADC10ON (0x010) /* ADC10
On/Enable */
185 000000 #define REFON (0x020) /* ADC10
Reference on */
186 000000 #define REF2_5V (0x040) /* ADC10
Ref 0:1.5V / 1:2.5V */
187 000000 #define MSC (0x080) /* ADC10
Multiple SampleConversion */
188 000000 #define REFBURST (0x100) /* ADC10
Reference Burst Mode */
189 000000 #define REFOUT (0x200) /* ADC10
Enalbe output of Ref. */
190 000000 #define ADC10SR (0x400) /* ADC10
Sampling Rate 0:200ksps / 1:50ksps */
191 000000 #define ADC10SHT0 (0x800) /* ADC10
Sample Hold Select Bit: 0 */
192 000000 #define ADC10SHT1 (0x1000u) /*
ADC10 Sample Hold Select Bit: 1 */
193 000000 #define SREF0 (0x2000u) /*
ADC10 Reference Select Bit: 0 */
194 000000 #define SREF1 (0x4000u) /*
ADC10 Reference Select Bit: 1 */
195 000000 #define SREF2 (0x8000u) /*
ADC10 Reference Select Bit: 2 */
196 000000 #define ADC10SHT_0 (0*0x800u) /* 4 x
ADC10CLKs */
197 000000 #define ADC10SHT_1 (1*0x800u) /* 8 x
ADC10CLKs */
198 000000 #define ADC10SHT_2 (2*0x800u) /* 16 x
ADC10CLKs */
199 000000 #define ADC10SHT_3 (3*0x800u) /* 64 x
ADC10CLKs */
200 000000
201 000000 #define SREF_0 (0*0x2000u) /* VR+
= AVCC and VR- = AVSS */
202 000000 #define SREF_1 (1*0x2000u) /* VR+
= VREF+ and VR- = AVSS */
203 000000 #define SREF_2 (2*0x2000u) /* VR+
= VEREF+ and VR- = AVSS */
204 000000 #define SREF_3 (3*0x2000u) /* VR+
= VEREF+ and VR- = AVSS */
205 000000 #define SREF_4 (4*0x2000u) /* VR+
= AVCC and VR- = VREF-/VEREF- */
206 000000 #define SREF_5 (5*0x2000u) /* VR+
= VREF+ and VR- = VREF-/VEREF- */
207 000000 #define SREF_6 (6*0x2000u) /* VR+
= VEREF+ and VR- = VREF-/VEREF- */
208 000000 #define SREF_7 (7*0x2000u) /* VR+
= VEREF+ and VR- = VREF-/VEREF- */
209 000000
210 000000 /* ADC10CTL1 */
211 000000 #define ADC10BUSY (0x0001u) /*
ADC10 BUSY */
212 000000 #define CONSEQ0 (0x0002u) /*
ADC10 Conversion Sequence Select 0 */
213 000000 #define CONSEQ1 (0x0004u) /*
ADC10 Conversion Sequence Select 1 */
214 000000 #define ADC10SSEL0 (0x0008u) /*
ADC10 Clock Source Select Bit: 0 */
215 000000 #define ADC10SSEL1 (0x0010u) /*
ADC10 Clock Source Select Bit: 1 */
216 000000 #define ADC10DIV0 (0x0020u) /*
ADC10 Clock Divider Select Bit: 0 */
217 000000 #define ADC10DIV1 (0x0040u) /*
ADC10 Clock Divider Select Bit: 1 */
218 000000 #define ADC10DIV2 (0x0080u) /*
ADC10 Clock Divider Select Bit: 2 */
219 000000 #define ISSH (0x0100u) /*
ADC10 Invert Sample Hold Signal */
220 000000 #define ADC10DF (0x0200u) /*
ADC10 Data Format 0:binary 1:2's complement
*/
221 000000 #define SHS0 (0x0400u) /*
ADC10 Sample/Hold Source Bit: 0 */
222 000000 #define SHS1 (0x0800u) /*
ADC10 Sample/Hold Source Bit: 1 */
223 000000 #define INCH0 (0x1000u) /*
ADC10 Input Channel Select Bit: 0 */
224 000000 #define INCH1 (0x2000u) /*
ADC10 Input Channel Select Bit: 1 */
225 000000 #define INCH2 (0x4000u) /*
ADC10 Input Channel Select Bit: 2 */
226 000000 #define INCH3 (0x8000u) /*
ADC10 Input Channel Select Bit: 3 */
227 000000
228 000000 #define CONSEQ_0 (0*2u) /*
Single channel single conversion */
229 000000 #define CONSEQ_1 (1*2u) /*
Sequence of channels */
230 000000 #define CONSEQ_2 (2*2u) /*
Repeat single channel */
231 000000 #define CONSEQ_3 (3*2u) /*
Repeat sequence of channels */
232 000000
233 000000 #define ADC10SSEL_0 (0*8u) /*
ADC10OSC */
234 000000 #define ADC10SSEL_1 (1*8u) /* ACLK
*/
235 000000 #define ADC10SSEL_2 (2*8u) /* MCLK
*/
236 000000 #define ADC10SSEL_3 (3*8u) /*
SMCLK */
237 000000
238 000000 #define ADC10DIV_0 (0*0x20u) /*
ADC10 Clock Divider Select 0 */
239 000000 #define ADC10DIV_1 (1*0x20u) /*
ADC10 Clock Divider Select 1 */
240 000000 #define ADC10DIV_2 (2*0x20u) /*
ADC10 Clock Divider Select 2 */
241 000000 #define ADC10DIV_3 (3*0x20u) /*
ADC10 Clock Divider Select 3 */
242 000000 #define ADC10DIV_4 (4*0x20u) /*
ADC10 Clock Divider Select 4 */
243 000000 #define ADC10DIV_5 (5*0x20u) /*
ADC10 Clock Divider Select 5 */
244 000000 #define ADC10DIV_6 (6*0x20u) /*
ADC10 Clock Divider Select 6 */
245 000000 #define ADC10DIV_7 (7*0x20u) /*
ADC10 Clock Divider Select 7 */
246 000000
247 000000 #define SHS_0 (0*0x400u) /*
ADC10SC */
248 000000 #define SHS_1 (1*0x400u) /* TA3
OUT1 */
249 000000 #define SHS_2 (2*0x400u) /* TA3
OUT0 */
250 000000 #define SHS_3 (3*0x400u) /* TA3
OUT2 */
251 000000
252 000000 #define INCH_0 (0*0x1000u) /*
Selects Channel 0 */
253 000000 #define INCH_1 (1*0x1000u) /*
Selects Channel 1 */
254 000000 #define INCH_2 (2*0x1000u) /*
Selects Channel 2 */
255 000000 #define INCH_3 (3*0x1000u) /*
Selects Channel 3 */
256 000000 #define INCH_4 (4*0x1000u) /*
Selects Channel 4 */
257 000000 #define INCH_5 (5*0x1000u) /*
Selects Channel 5 */
258 000000 #define INCH_6 (6*0x1000u) /*
Selects Channel 6 */
259 000000 #define INCH_7 (7*0x1000u) /*
Selects Channel 7 */
260 000000 #define INCH_8 (8*0x1000u) /*
Selects Channel 8 */
261 000000 #define INCH_9 (9*0x1000u) /*
Selects Channel 9 */
262 000000 #define INCH_10 (10*0x1000u) /*
Selects Channel 10 */
263 000000 #define INCH_11 (11*0x1000u) /*
Selects Channel 11 */
264 000000 #define INCH_12 (12*0x1000u) /*
Selects Channel 12 */
265 000000 #define INCH_13 (13*0x1000u) /*
Selects Channel 13 */
266 000000 #define INCH_14 (14*0x1000u) /*
Selects Channel 14 */
267 000000 #define INCH_15 (15*0x1000u) /*
Selects Channel 15 */
268 000000
269 000000 /* ADC10DTC0 */
270 000000 #define ADC10FETCH (0x001) /* This
bit should normally be reset */
271 000000 #define ADC10B1 (0x002) /* ADC10
block one */
272 000000 #define ADC10CT (0x004) /* ADC10
continuous transfer */
273 000000 #define ADC10TB (0x008) /* ADC10
two-block mode */
274 000000 #define ADC10DISABLE (0x000) /*
ADC10DTC1 */
275 000000
276 000000 /***********************************************
*************
277 000000 * Basic Clock Module
278 000000 ************************************************
************/
279 000000 #define __MSP430_HAS_BC2__ /*
Definition to show that Module is available
*/
280 000000
281 000000 #define DCOCTL_ (0x0056u) /* DCO
Clock Frequency Control */
282 000000 DEFC( DCOCTL , DCOCTL_)
283 000000 #define BCSCTL1_ (0x0057u) /* Basic
Clock System Control 1 */
284 000000 DEFC( BCSCTL1 , BCSCTL1_)
285 000000 #define BCSCTL2_ (0x0058u) /* Basic
Clock System Control 2 */
286 000000 DEFC( BCSCTL2 , BCSCTL2_)
287 000000 #define BCSCTL3_ (0x0053u) /* Basic
Clock System Control 3 */
288 000000 DEFC( BCSCTL3 , BCSCTL3_)
289 000000
290 000000 #define MOD0 (0x01) /*
Modulation Bit 0 */
291 000000 #define MOD1 (0x02) /*
Modulation Bit 1 */
292 000000 #define MOD2 (0x04) /*
Modulation Bit 2 */
293 000000 #define MOD3 (0x08) /*
Modulation Bit 3 */
294 000000 #define MOD4 (0x10) /*
Modulation Bit 4 */
295 000000 #define DCO0 (0x20) /* DCO
Select Bit 0 */
296 000000 #define DCO1 (0x40) /* DCO
Select Bit 1 */
297 000000 #define DCO2 (0x80) /* DCO
Select Bit 2 */
298 000000
299 000000 #define RSEL0 (0x01) /* Range
Select Bit 0 */
300 000000 #define RSEL1 (0x02) /* Range
Select Bit 1 */
301 000000 #define RSEL2 (0x04) /* Range
Select Bit 2 */
302 000000 #define RSEL3 (0x08) /* Range
Select Bit 3 */
303 000000 #define DIVA0 (0x10) /* ACLK
Divider 0 */
304 000000 #define DIVA1 (0x20) /* ACLK
Divider 1 */
305 000000 #define XTS (0x40) /* LFXTCLK
0:Low Freq. / 1: High Freq. */
306 000000 #define XT2OFF (0x80) /* Enable
XT2CLK */
307 000000
308 000000 #define DIVA_0 (0x00) /* ACLK
Divider 0: /1 */
309 000000 #define DIVA_1 (0x10) /* ACLK
Divider 1: /2 */
310 000000 #define DIVA_2 (0x20) /* ACLK
Divider 2: /4 */
311 000000 #define DIVA_3 (0x30) /* ACLK
Divider 3: /8 */
312 000000
313 000000 #define DIVS0 (0x02) /* SMCLK
Divider 0 */
314 000000 #define DIVS1 (0x04) /* SMCLK
Divider 1 */
315 000000 #define SELS (0x08) /* SMCLK
Source Select 0:DCOCLK / 1:XT2CLK/LFXTCLK
*/
316 000000 #define DIVM0 (0x10) /* MCLK
Divider 0 */
317 000000 #define DIVM1 (0x20) /* MCLK
Divider 1 */
318 000000 #define SELM0 (0x40) /* MCLK
Source Select 0 */
319 000000 #define SELM1 (0x80) /* MCLK
Source Select 1 */
320 000000
321 000000 #define DIVS_0 (0x00) /* SMCLK
Divider 0: /1 */
322 000000 #define DIVS_1 (0x02) /* SMCLK
Divider 1: /2 */
323 000000 #define DIVS_2 (0x04) /* SMCLK
Divider 2: /4 */
324 000000 #define DIVS_3 (0x06) /* SMCLK
Divider 3: /8 */
325 000000
326 000000 #define DIVM_0 (0x00) /* MCLK
Divider 0: /1 */
327 000000 #define DIVM_1 (0x10) /* MCLK
Divider 1: /2 */
328 000000 #define DIVM_2 (0x20) /* MCLK
Divider 2: /4 */
329 000000 #define DIVM_3 (0x30) /* MCLK
Divider 3: /8 */
330 000000
331 000000 #define SELM_0 (0x00) /* MCLK
Source Select 0: DCOCLK */
332 000000 #define SELM_1 (0x40) /* MCLK
Source Select 1: DCOCLK */
333 000000 #define SELM_2 (0x80) /* MCLK
Source Select 2: XT2CLK/LFXTCLK */
334 000000 #define SELM_3 (0xC0) /* MCLK
Source Select 3: LFXTCLK */
335 000000
336 000000 #define LFXT1OF (0x01) /* Low/high
Frequency Oscillator Fault Flag */
337 000000 #define XT2OF (0x02) /* High
frequency oscillator 2 fault flag */
338 000000 #define XCAP0 (0x04) /* XIN/XOUT
Cap 0 */
339 000000 #define XCAP1 (0x08) /* XIN/XOUT
Cap 1 */
340 000000 #define LFXT1S0 (0x10) /* Mode 0
for LFXT1 (XTS = 0) */
341 000000 #define LFXT1S1 (0x20) /* Mode 1
for LFXT1 (XTS = 0) */
342 000000 #define XT2S0 (0x40) /* Mode 0
for XT2 */
343 000000 #define XT2S1 (0x80) /* Mode 1
for XT2 */
344 000000
345 000000 #define XCAP_0 (0x00) /* XIN/XOUT
Cap : 0 pF */
346 000000 #define XCAP_1 (0x04) /* XIN/XOUT
Cap : 6 pF */
347 000000 #define XCAP_2 (0x08) /* XIN/XOUT
Cap : 10 pF */
348 000000 #define XCAP_3 (0x0C) /* XIN/XOUT
Cap : 12.5 pF */
349 000000
350 000000 #define LFXT1S_0 (0x00) /* Mode 0
for LFXT1 : Normal operation */
351 000000 #define LFXT1S_1 (0x10) /* Mode 1
for LFXT1 : Reserved */
352 000000 #define LFXT1S_2 (0x20) /* Mode 2
for LFXT1 : VLO */
353 000000 #define LFXT1S_3 (0x30) /* Mode 3
for LFXT1 : Digital input signal */
354 000000
355 000000 #define XT2S_0 (0x00) /* Mode 0
for XT2 : 0.4 - 1 MHz */
356 000000 #define XT2S_1 (0x40) /* Mode 1
for XT2 : 1 - 4 MHz */
357 000000 #define XT2S_2 (0x80) /* Mode 2
for XT2 : 2 - 16 MHz */
358 000000 #define XT2S_3 (0xC0) /* Mode 3
for XT2 : Digital input signal */
359 000000
360 000000 /***********************************************
*************
361 000000 * Comparator A
362 000000 ************************************************
************/
363 000000 #define __MSP430_HAS_CAPLUS__ /*
Definition to show that Module is available
*/
364 000000
365 000000 #define CACTL1_ (0x0059u) /*
Comparator A Control 1 */
366 000000 DEFC( CACTL1 , CACTL1_)
367 000000 #define CACTL2_ (0x005Au) /*
Comparator A Control 2 */
368 000000 DEFC( CACTL2 , CACTL2_)
369 000000 #define CAPD_ (0x005Bu) /*
Comparator A Port Disable */
370 000000 DEFC( CAPD , CAPD_)
371 000000
372 000000 #define CAIFG (0x01) /* Comp. A
Interrupt Flag */
373 000000 #define CAIE (0x02) /* Comp. A
Interrupt Enable */
374 000000 #define CAIES (0x04) /* Comp. A
Int. Edge Select: 0:rising / 1:falling
*/
375 000000 #define CAON (0x08) /* Comp. A
enable */
376 000000 #define CAREF0 (0x10) /* Comp. A
Internal Reference Select 0 */
377 000000 #define CAREF1 (0x20) /* Comp. A
Internal Reference Select 1 */
378 000000 #define CARSEL (0x40) /* Comp. A
Internal Reference Enable */
379 000000 #define CAEX (0x80) /* Comp. A
Exchange Inputs */
380 000000
381 000000 #define CAREF_0 (0x00) /* Comp. A
Int. Ref. Select 0 : Off */
382 000000 #define CAREF_1 (0x10) /* Comp. A
Int. Ref. Select 1 : 0.25*Vcc */
383 000000 #define CAREF_2 (0x20) /* Comp. A
Int. Ref. Select 2 : 0.5*Vcc */
384 000000 #define CAREF_3 (0x30) /* Comp. A
Int. Ref. Select 3 : Vt*/
385 000000
386 000000 #define CAOUT (0x01) /* Comp. A
Output */
387 000000 #define CAF (0x02) /* Comp. A
Enable Output Filter */
388 000000 #define P2CA0 (0x04) /* Comp. A
+Terminal Multiplexer */
389 000000 #define P2CA1 (0x08) /* Comp. A
-Terminal Multiplexer */
390 000000 #define P2CA2 (0x10) /* Comp. A
-Terminal Multiplexer */
391 000000 #define P2CA3 (0x20) /* Comp. A
-Terminal Multiplexer */
392 000000 #define P2CA4 (0x40) /* Comp. A
+Terminal Multiplexer */
393 000000 #define CASHORT (0x80) /* Comp. A
Short + and - Terminals */
394 000000
395 000000 #define CAPD0 (0x01) /* Comp. A
Disable Input Buffer of Port Register .0
*/
396 000000 #define CAPD1 (0x02) /* Comp. A
Disable Input Buffer of Port Register .1
*/
397 000000 #define CAPD2 (0x04) /* Comp. A
Disable Input Buffer of Port Register .2
*/
398 000000 #define CAPD3 (0x08) /* Comp. A
Disable Input Buffer of Port Register .3
*/
399 000000 #define CAPD4 (0x10) /* Comp. A
Disable Input Buffer of Port Register .4
*/
400 000000 #define CAPD5 (0x20) /* Comp. A
Disable Input Buffer of Port Register .5
*/
401 000000 #define CAPD6 (0x40) /* Comp. A
Disable Input Buffer of Port Register .6
*/
402 000000 #define CAPD7 (0x80) /* Comp. A
Disable Input Buffer of Port Register .7
*/
403 000000
404 000000 /***********************************************
**************
405 000000 * Flash Memory
406 000000 ************************************************
*************/
407 000000 #define __MSP430_HAS_FLASH2__ /*
Definition to show that Module is available
*/
408 000000
409 000000 #define FCTL1_ (0x0128u) /* FLASH
Control 1 */
410 000000 DEFW( FCTL1 , FCTL1_)
411 000000 #define FCTL2_ (0x012Au) /* FLASH
Control 2 */
412 000000 DEFW( FCTL2 , FCTL2_)
413 000000 #define FCTL3_ (0x012Cu) /* FLASH
Control 3 */
414 000000 DEFW( FCTL3 , FCTL3_)
415 000000
416 000000 #define FRKEY (0x9600u) /* Flash
key returned by read */
417 000000 #define FWKEY (0xA500u) /* Flash
key for write */
418 000000 #define FXKEY (0x3300u) /* for
use with XOR instruction */
419 000000
420 000000 #define ERASE (0x0002u) /* Enable
bit for Flash segment erase */
421 000000 #define MERAS (0x0004u) /* Enable
bit for Flash mass erase */
422 000000 #define WRT (0x0040u) /* Enable
bit for Flash write */
423 000000 #define BLKWRT (0x0080u) /* Enable
bit for Flash segment write */
424 000000 #define SEGWRT (0x0080u) /* old
definition */ /* Enable bit for Flash segment
write */
425 000000
426 000000 #define FN0 (0x0001u) /* Divide
Flash clock by 1 to 64 using FN0 to FN5
according to: */
427 000000 #define FN1 (0x0002u) /*
32*FN5 + 16*FN4 + 8*FN3 + 4*FN2 + 2*FN1 + FN0 +
1 */
428 000000 #ifndef FN2
429 000000 #define FN2 (0x0004u)
430 000000 #endif
431 000000 #ifndef FN3
432 000000 #define FN3 (0x0008u)
433 000000 #endif
434 000000 #ifndef FN4
435 000000 #define FN4 (0x0010u)
436 000000 #endif
437 000000 #define FN5 (0x0020u)
438 000000 #define FSSEL0 (0x0040u) /* Flash
clock select 0 */ /* to distinguish from
USART SSELx */
439 000000 #define FSSEL1 (0x0080u) /* Flash
clock select 1 */
440 000000
441 000000 #define FSSEL_0 (0x0000u) /* Flash
clock select: 0 - ACLK */
442 000000 #define FSSEL_1 (0x0040u) /* Flash
clock select: 1 - MCLK */
443 000000 #define FSSEL_2 (0x0080u) /* Flash
clock select: 2 - SMCLK */
444 000000 #define FSSEL_3 (0x00C0u) /* Flash
clock select: 3 - SMCLK */
445 000000
446 000000 #define BUSY (0x0001u) /* Flash
busy: 1 */
447 000000 #define KEYV (0x0002u) /* Flash
Key violation flag */
448 000000 #define ACCVIFG (0x0004u) /* Flash
Access violation flag */
449 000000 #define WAIT (0x0008u) /* Wait
flag for segment write */
450 000000 #define LOCK (0x0010u) /* Lock
bit: 1 - Flash is locked (read only) */
451 000000 #define EMEX (0x0020u) /* Flash
Emergency Exit */
452 000000 #define LOCKA (0x0040u) /*
Segment A Lock bit: read = 1 - Segment is
locked (read only) */
453 000000 #define FAIL (0x0080u) /* Last
Program or Erase failed */
454 000000
455 000000 /***********************************************
*************
456 000000 * DIGITAL I/O Port1/2 Pull up / Pull down
Resistors
457 000000 ************************************************
************/
458 000000 #define __MSP430_HAS_PORT1_R__ /*
Definition to show that Module is available
*/
459 000000 #define __MSP430_HAS_PORT2_R__ /*
Definition to show that Module is available
*/
460 000000
461 000000 #define P1IN_ (0x0020u) /* Port 1
Input */
462 000000 READ_ONLY DEFC( P1IN , P1IN_)
463 000000 #define P1OUT_ (0x0021u) /* Port 1
Output */
464 000000 DEFC( P1OUT , P1OUT_)
465 000000 #define P1DIR_ (0x0022u) /* Port 1
Direction */
466 000000 DEFC( P1DIR , P1DIR_)
467 000000 #define P1IFG_ (0x0023u) /* Port 1
Interrupt Flag */
468 000000 DEFC( P1IFG , P1IFG_)
469 000000 #define P1IES_ (0x0024u) /* Port 1
Interrupt Edge Select */
470 000000 DEFC( P1IES , P1IES_)
471 000000 #define P1IE_ (0x0025u) /* Port 1
Interrupt Enable */
472 000000 DEFC( P1IE , P1IE_)
473 000000 #define P1SEL_ (0x0026u) /* Port 1
Selection */
474 000000 DEFC( P1SEL , P1SEL_)
475 000000 #define P1SEL2_ (0x0041u) /* Port 1
Selection 2 */
476 000000 DEFC( P1SEL2 , P1SEL2_)
477 000000 #define P1REN_ (0x0027u) /* Port 1
Resistor Enable */
478 000000 DEFC( P1REN , P1REN_)
479 000000
480 000000 #define P2IN_ (0x0028u) /* Port 2
Input */
481 000000 READ_ONLY DEFC( P2IN , P2IN_)
482 000000 #define P2OUT_ (0x0029u) /* Port 2
Output */
483 000000 DEFC( P2OUT , P2OUT_)
484 000000 #define P2DIR_ (0x002Au) /* Port 2
Direction */
485 000000 DEFC( P2DIR , P2DIR_)
486 000000 #define P2IFG_ (0x002Bu) /* Port 2
Interrupt Flag */
487 000000 DEFC( P2IFG , P2IFG_)
488 000000 #define P2IES_ (0x002Cu) /* Port 2
Interrupt Edge Select */
489 000000 DEFC( P2IES , P2IES_)
490 000000 #define P2IE_ (0x002Du) /* Port 2
Interrupt Enable */
491 000000 DEFC( P2IE , P2IE_)
492 000000 #define P2SEL_ (0x002Eu) /* Port 2
Selection */
493 000000 DEFC( P2SEL , P2SEL_)
494 000000 #define P2SEL2_ (0x0042u) /* Port 2
Selection 2 */
495 000000 DEFC( P2SEL2 , P2SEL2_)
496 000000 #define P2REN_ (0x002Fu) /* Port 2
Resistor Enable */
497 000000 DEFC( P2REN , P2REN_)
498 000000
499 000000 /***********************************************
*************
500 000000 * DIGITAL I/O Port3 Pull up / Pull down
Resistors
501 000000 ************************************************
************/
502 000000 #define __MSP430_HAS_PORT3_R__ /*
Definition to show that Module is available
*/
503 000000
504 000000 #define P3IN_ (0x0018u) /* Port 3
Input */
505 000000 READ_ONLY DEFC( P3IN , P3IN_)
506 000000 #define P3OUT_ (0x0019u) /* Port 3
Output */
507 000000 DEFC( P3OUT , P3OUT_)
508 000000 #define P3DIR_ (0x001Au) /* Port 3
Direction */
509 000000 DEFC( P3DIR , P3DIR_)
510 000000 #define P3SEL_ (0x001Bu) /* Port 3
Selection */
511 000000 DEFC( P3SEL , P3SEL_)
512 000000 #define P3SEL2_ (0x0043u) /* Port 3
Selection 2 */
513 000000 DEFC( P3SEL2 , P3SEL2_)
514 000000 #define P3REN_ (0x0010u) /* Port 3
Resistor Enable */
515 000000 DEFC( P3REN , P3REN_)
516 000000
517 000000 /***********************************************
*************
518 000000 * Timer0_A3
519 000000 ************************************************
************/
520 000000 #define __MSP430_HAS_TA3__ /*
Definition to show that Module is available
*/
521 000000
522 000000 #define TA0IV_ (0x012Eu) /*
Timer0_A3 Interrupt Vector Word */
523 000000 READ_ONLY DEFW( TA0IV , TA0IV_)
524 000000 #define TA0CTL_ (0x0160u) /*
Timer0_A3 Control */
525 000000 DEFW( TA0CTL , TA0CTL_)
526 000000 #define TA0CCTL0_ (0x0162u) /*
Timer0_A3 Capture/Compare Control 0 */
527 000000 DEFW( TA0CCTL0 , TA0CCTL0_)
528 000000 #define TA0CCTL1_ (0x0164u) /*
Timer0_A3 Capture/Compare Control 1 */
529 000000 DEFW( TA0CCTL1 , TA0CCTL1_)
530 000000 #define TA0CCTL2_ (0x0166u) /*
Timer0_A3 Capture/Compare Control 2 */
531 000000 DEFW( TA0CCTL2 , TA0CCTL2_)
532 000000 #define TA0R_ (0x0170u) /*
Timer0_A3 */
533 000000 DEFW( TA0R , TA0R_)
534 000000 #define TA0CCR0_ (0x0172u) /*
Timer0_A3 Capture/Compare 0 */
535 000000 DEFW( TA0CCR0 , TA0CCR0_)
536 000000 #define TA0CCR1_ (0x0174u) /*
Timer0_A3 Capture/Compare 1 */
537 000000 DEFW( TA0CCR1 , TA0CCR1_)
538 000000 #define TA0CCR2_ (0x0176u) /*
Timer0_A3 Capture/Compare 2 */
539 000000 DEFW( TA0CCR2 , TA0CCR2_)
540 000000
541 000000 /* Alternate register names */
542 000000 #define TAIV TA0IV /* Timer A
Interrupt Vector Word */
543 000000 #define TACTL TA0CTL /* Timer A
Control */
544 000000 #define TACCTL0 TA0CCTL0 /* Timer A
Capture/Compare Control 0 */
545 000000 #define TACCTL1 TA0CCTL1 /* Timer A
Capture/Compare Control 1 */
546 000000 #define TACCTL2 TA0CCTL2 /* Timer A
Capture/Compare Control 2 */
547 000000 #define TAR TA0R /* Timer A
*/
548 000000 #define TACCR0 TA0CCR0 /* Timer A
Capture/Compare 0 */
549 000000 #define TACCR1 TA0CCR1 /* Timer A
Capture/Compare 1 */
550 000000 #define TACCR2 TA0CCR2 /* Timer A
Capture/Compare 2 */
551 000000 #define TAIV_ TA0IV_ /* Timer A
Interrupt Vector Word */
552 000000 #define TACTL_ TA0CTL_ /* Timer A
Control */
553 000000 #define TACCTL0_ TA0CCTL0_ /* Timer A
Capture/Compare Control 0 */
554 000000 #define TACCTL1_ TA0CCTL1_ /* Timer A
Capture/Compare Control 1 */
555 000000 #define TACCTL2_ TA0CCTL2_ /* Timer A
Capture/Compare Control 2 */
556 000000 #define TAR_ TA0R_ /* Timer A
*/
557 000000 #define TACCR0_ TA0CCR0_ /* Timer A
Capture/Compare 0 */
558 000000 #define TACCR1_ TA0CCR1_ /* Timer A
Capture/Compare 1 */
559 000000 #define TACCR2_ TA0CCR2_ /* Timer A
Capture/Compare 2 */
560 000000
561 000000 /* Alternate register names 2 */
562 000000 #define CCTL0 TACCTL0 /* Timer A
Capture/Compare Control 0 */
563 000000 #define CCTL1 TACCTL1 /* Timer A
Capture/Compare Control 1 */
564 000000 #define CCTL2 TACCTL2 /* Timer A
Capture/Compare Control 2 */
565 000000 #define CCR0 TACCR0 /* Timer A
Capture/Compare 0 */
566 000000 #define CCR1 TACCR1 /* Timer A
Capture/Compare 1 */
567 000000 #define CCR2 TACCR2 /* Timer A
Capture/Compare 2 */
568 000000 #define CCTL0_ TACCTL0_ /* Timer A
Capture/Compare Control 0 */
569 000000 #define CCTL1_ TACCTL1_ /* Timer A
Capture/Compare Control 1 */
570 000000 #define CCTL2_ TACCTL2_ /* Timer A
Capture/Compare Control 2 */
571 000000 #define CCR0_ TACCR0_ /* Timer A
Capture/Compare 0 */
572 000000 #define CCR1_ TACCR1_ /* Timer A
Capture/Compare 1 */
573 000000 #define CCR2_ TACCR2_ /* Timer A
Capture/Compare 2 */
574 000000
575 000000 #define TASSEL1 (0x0200u) /* Timer
A clock source select 0 */
576 000000 #define TASSEL0 (0x0100u) /* Timer
A clock source select 1 */
577 000000 #define ID1 (0x0080u) /* Timer
A clock input divider 1 */
578 000000 #define ID0 (0x0040u) /* Timer
A clock input divider 0 */
579 000000 #define MC1 (0x0020u) /* Timer
A mode control 1 */
580 000000 #define MC0 (0x0010u) /* Timer
A mode control 0 */
581 000000 #define TACLR (0x0004u) /* Timer
A counter clear */
582 000000 #define TAIE (0x0002u) /* Timer
A counter interrupt enable */
583 000000 #define TAIFG (0x0001u) /* Timer
A counter interrupt flag */
584 000000
585 000000 #define MC_0 (0*0x10u) /* Timer
A mode control: 0 - Stop */
586 000000 #define MC_1 (1*0x10u) /* Timer
A mode control: 1 - Up to CCR0 */
587 000000 #define MC_2 (2*0x10u) /* Timer
A mode control: 2 - Continous up */
588 000000 #define MC_3 (3*0x10u) /* Timer
A mode control: 3 - Up/Down */
589 000000 #define ID_0 (0*0x40u) /* Timer
A input divider: 0 - /1 */
590 000000 #define ID_1 (1*0x40u) /* Timer
A input divider: 1 - /2 */
591 000000 #define ID_2 (2*0x40u) /* Timer
A input divider: 2 - /4 */
592 000000 #define ID_3 (3*0x40u) /* Timer
A input divider: 3 - /8 */
593 000000 #define TASSEL_0 (0*0x100u) /* Timer
A clock source select: 0 - TACLK */
594 000000 #define TASSEL_1 (1*0x100u) /* Timer
A clock source select: 1 - ACLK */
595 000000 #define TASSEL_2 (2*0x100u) /* Timer
A clock source select: 2 - SMCLK */
596 000000 #define TASSEL_3 (3*0x100u) /* Timer
A clock source select: 3 - INCLK */
597 000000
598 000000 #define CM1 (0x8000u) /*
Capture mode 1 */
599 000000 #define CM0 (0x4000u) /*
Capture mode 0 */
600 000000 #define CCIS1 (0x2000u) /*
Capture input select 1 */
601 000000 #define CCIS0 (0x1000u) /*
Capture input select 0 */
602 000000 #define SCS (0x0800u) /*
Capture sychronize */
603 000000 #define SCCI (0x0400u) /*
Latched capture signal (read) */
604 000000 #define CAP (0x0100u) /*
Capture mode: 1 /Compare mode : 0 */
605 000000 #define OUTMOD2 (0x0080u) /* Output
mode 2 */
606 000000 #define OUTMOD1 (0x0040u) /* Output
mode 1 */
607 000000 #define OUTMOD0 (0x0020u) /* Output
mode 0 */
608 000000 #define CCIE (0x0010u) /*
Capture/compare interrupt enable */
609 000000 #define CCI (0x0008u) /*
Capture input signal (read) */
610 000000 #define OUT (0x0004u) /* PWM
Output signal if output mode 0 */
611 000000 #define COV (0x0002u) /*
Capture/compare overflow flag */
612 000000 #define CCIFG (0x0001u) /*
Capture/compare interrupt flag */
613 000000
614 000000 #define OUTMOD_0 (0*0x20u) /* PWM
output mode: 0 - output only */
615 000000 #define OUTMOD_1 (1*0x20u) /* PWM
output mode: 1 - set */
616 000000 #define OUTMOD_2 (2*0x20u) /* PWM
output mode: 2 - PWM toggle/reset */
617 000000 #define OUTMOD_3 (3*0x20u) /* PWM
output mode: 3 - PWM set/reset */
618 000000 #define OUTMOD_4 (4*0x20u) /* PWM
output mode: 4 - toggle */
619 000000 #define OUTMOD_5 (5*0x20u) /* PWM
output mode: 5 - Reset */
620 000000 #define OUTMOD_6 (6*0x20u) /* PWM
output mode: 6 - PWM toggle/set */
621 000000 #define OUTMOD_7 (7*0x20u) /* PWM
output mode: 7 - PWM reset/set */
622 000000 #define CCIS_0 (0*0x1000u) /*
Capture input select: 0 - CCIxA */
623 000000 #define CCIS_1 (1*0x1000u) /*
Capture input select: 1 - CCIxB */
624 000000 #define CCIS_2 (2*0x1000u) /*
Capture input select: 2 - GND */
625 000000 #define CCIS_3 (3*0x1000u) /*
Capture input select: 3 - Vcc */
626 000000 #define CM_0 (0*0x4000u) /*
Capture mode: 0 - disabled */
627 000000 #define CM_1 (1*0x4000u) /*
Capture mode: 1 - pos. edge */
628 000000 #define CM_2 (2*0x4000u) /*
Capture mode: 1 - neg. edge */
629 000000 #define CM_3 (3*0x4000u) /*
Capture mode: 1 - both edges */
630 000000
631 000000 /* T0_A3IV Definitions */
632 000000 #define TA0IV_NONE (0x0000u) /* No
Interrupt pending */
633 000000 #define TA0IV_TACCR1 (0x0002u) /*
TA0CCR1_CCIFG */
634 000000 #define TA0IV_TACCR2 (0x0004u) /*
TA0CCR2_CCIFG */
635 000000 #define TA0IV_6 (0x0006u) /*
Reserved */
636 000000 #define TA0IV_8 (0x0008u) /*
Reserved */
637 000000 #define TA0IV_TAIFG (0x000Au) /*
TA0IFG */
638 000000
639 000000 /***********************************************
*************
640 000000 * Timer1_A3
641 000000 ************************************************
************/
642 000000 #define __MSP430_HAS_T1A3__ /*
Definition to show that Module is available
*/
643 000000
644 000000 #define TA1IV_ (0x011Eu) /*
Timer1_A3 Interrupt Vector Word */
645 000000 READ_ONLY DEFW( TA1IV , TA1IV_)
646 000000 #define TA1CTL_ (0x0180u) /*
Timer1_A3 Control */
647 000000 DEFW( TA1CTL , TA1CTL_)
648 000000 #define TA1CCTL0_ (0x0182u) /*
Timer1_A3 Capture/Compare Control 0 */
649 000000 DEFW( TA1CCTL0 , TA1CCTL0_)
650 000000 #define TA1CCTL1_ (0x0184u) /*
Timer1_A3 Capture/Compare Control 1 */
651 000000 DEFW( TA1CCTL1 , TA1CCTL1_)
652 000000 #define TA1CCTL2_ (0x0186u) /*
Timer1_A3 Capture/Compare Control 2 */
653 000000 DEFW( TA1CCTL2 , TA1CCTL2_)
654 000000 #define TA1R_ (0x0190u) /*
Timer1_A3 */
655 000000 DEFW( TA1R , TA1R_)
656 000000 #define TA1CCR0_ (0x0192u) /*
Timer1_A3 Capture/Compare 0 */
657 000000 DEFW( TA1CCR0 , TA1CCR0_)
658 000000 #define TA1CCR1_ (0x0194u) /*
Timer1_A3 Capture/Compare 1 */
659 000000 DEFW( TA1CCR1 , TA1CCR1_)
660 000000 #define TA1CCR2_ (0x0196u) /*
Timer1_A3 Capture/Compare 2 */
661 000000 DEFW( TA1CCR2 , TA1CCR2_)
662 000000
663 000000 /* Bits are already defined within the Timer0_Ax
*/
664 000000
665 000000 /* T1_A3IV Definitions */
666 000000 #define TA1IV_NONE (0x0000u) /* No
Interrupt pending */
667 000000 #define TA1IV_TACCR1 (0x0002u) /*
TA1CCR1_CCIFG */
668 000000 #define TA1IV_TACCR2 (0x0004u) /*
TA1CCR2_CCIFG */
669 000000 #define TA1IV_TAIFG (0x000Au) /*
TA1IFG */
670 000000
671 000000 /***********************************************
*************
672 000000 * USCI
673 000000 ************************************************
************/
674 000000 #define __MSP430_HAS_USCI__ /*
Definition to show that Module is available
*/
675 000000
676 000000 #define UCA0CTL0_ (0x0060u) /* USCI
A0 Control Register 0 */
677 000000 DEFC( UCA0CTL0 , UCA0CTL0_)
678 000000 #define UCA0CTL1_ (0x0061u) /* USCI
A0 Control Register 1 */
679 000000 DEFC( UCA0CTL1 , UCA0CTL1_)
680 000000 #define UCA0BR0_ (0x0062u) /* USCI
A0 Baud Rate 0 */
681 000000 DEFC( UCA0BR0 , UCA0BR0_)
682 000000 #define UCA0BR1_ (0x0063u) /* USCI
A0 Baud Rate 1 */
683 000000 DEFC( UCA0BR1 , UCA0BR1_)
684 000000 #define UCA0MCTL_ (0x0064u) /* USCI
A0 Modulation Control */
685 000000 DEFC( UCA0MCTL , UCA0MCTL_)
686 000000 #define UCA0STAT_ (0x0065u) /* USCI
A0 Status Register */
687 000000 DEFC( UCA0STAT , UCA0STAT_)
688 000000 #define UCA0RXBUF_ (0x0066u) /* USCI
A0 Receive Buffer */
689 000000 READ_ONLY DEFC( UCA0RXBUF , UCA0RXBUF_)
690 000000 #define UCA0TXBUF_ (0x0067u) /* USCI
A0 Transmit Buffer */
691 000000 DEFC( UCA0TXBUF , UCA0TXBUF_)
692 000000 #define UCA0ABCTL_ (0x005Du) /* USCI
A0 LIN Control */
693 000000 DEFC( UCA0ABCTL , UCA0ABCTL_)
694 000000 #define UCA0IRTCTL_ (0x005Eu) /* USCI
A0 IrDA Transmit Control */
695 000000 DEFC( UCA0IRTCTL , UCA0IRTCTL_)
696 000000 #define UCA0IRRCTL_ (0x005Fu) /* USCI
A0 IrDA Receive Control */
697 000000 DEFC( UCA0IRRCTL , UCA0IRRCTL_)
698 000000
699 000000
700 000000
701 000000 #define UCB0CTL0_ (0x0068u) /* USCI
B0 Control Register 0 */
702 000000 DEFC( UCB0CTL0 , UCB0CTL0_)
703 000000 #define UCB0CTL1_ (0x0069u) /* USCI
B0 Control Register 1 */
704 000000 DEFC( UCB0CTL1 , UCB0CTL1_)
705 000000 #define UCB0BR0_ (0x006Au) /* USCI
B0 Baud Rate 0 */
706 000000 DEFC( UCB0BR0 , UCB0BR0_)
707 000000 #define UCB0BR1_ (0x006Bu) /* USCI
B0 Baud Rate 1 */
708 000000 DEFC( UCB0BR1 , UCB0BR1_)
709 000000 #define UCB0I2CIE_ (0x006Cu) /* USCI
B0 I2C Interrupt Enable Register */
710 000000 DEFC( UCB0I2CIE , UCB0I2CIE_)
711 000000 #define UCB0STAT_ (0x006Du) /* USCI
B0 Status Register */
712 000000 DEFC( UCB0STAT , UCB0STAT_)
713 000000 #define UCB0RXBUF_ (0x006Eu) /* USCI
B0 Receive Buffer */
714 000000 READ_ONLY DEFC( UCB0RXBUF , UCB0RXBUF_)
715 000000 #define UCB0TXBUF_ (0x006Fu) /* USCI
B0 Transmit Buffer */
716 000000 DEFC( UCB0TXBUF , UCB0TXBUF_)
717 000000 #define UCB0I2COA_ (0x0118u) /* USCI
B0 I2C Own Address */
718 000000 DEFW( UCB0I2COA , UCB0I2COA_)
719 000000 #define UCB0I2CSA_ (0x011Au) /* USCI
B0 I2C Slave Address */
720 000000 DEFW( UCB0I2CSA , UCB0I2CSA_)
721 000000
722 000000 // UART-Mode Bits
723 000000 #define UCPEN (0x80) /* Async.
Mode: Parity enable */
724 000000 #define UCPAR (0x40) /* Async.
Mode: Parity 0:odd / 1:even */
725 000000 #define UCMSB (0x20) /* Async.
Mode: MSB first 0:LSB / 1:MSB */
726 000000 #define UC7BIT (0x10) /* Async.
Mode: Data Bits 0:8-bits / 1:7-bits */
727 000000 #define UCSPB (0x08) /* Async.
Mode: Stop Bits 0:one / 1: two */
728 000000 #define UCMODE1 (0x04) /* Async.
Mode: USCI Mode 1 */
729 000000 #define UCMODE0 (0x02) /* Async.
Mode: USCI Mode 0 */
730 000000 #define UCSYNC (0x01) /*
Sync-Mode 0:UART-Mode / 1:SPI-Mode */
731 000000
732 000000 // SPI-Mode Bits
733 000000 #define UCCKPH (0x80) /* Sync.
Mode: Clock Phase */
734 000000 #define UCCKPL (0x40) /* Sync.
Mode: Clock Polarity */
735 000000 #define UCMST (0x08) /* Sync.
Mode: Master Select */
736 000000
737 000000 // I2C-Mode Bits
738 000000 #define UCA10 (0x80) /* 10-bit
Address Mode */
739 000000 #define UCSLA10 (0x40) /* 10-bit
Slave Address Mode */
740 000000 #define UCMM (0x20) /*
Multi-Master Environment */
741 000000 //#define res (0x10) /*
reserved */
742 000000 #define UCMODE_0 (0x00) /* Sync.
Mode: USCI Mode: 0 */
743 000000 #define UCMODE_1 (0x02) /* Sync.
Mode: USCI Mode: 1 */
744 000000 #define UCMODE_2 (0x04) /* Sync.
Mode: USCI Mode: 2 */
745 000000 #define UCMODE_3 (0x06) /* Sync.
Mode: USCI Mode: 3 */
746 000000
747 000000 // UART-Mode Bits
748 000000 #define UCSSEL1 (0x80) /* USCI 0
Clock Source Select 1 */
749 000000 #define UCSSEL0 (0x40) /* USCI 0
Clock Source Select 0 */
750 000000 #define UCRXEIE (0x20) /* RX
Error interrupt enable */
751 000000 #define UCBRKIE (0x10) /* Break
interrupt enable */
752 000000 #define UCDORM (0x08) /* Dormant
(Sleep) Mode */
753 000000 #define UCTXADDR (0x04) /* Send
next Data as Address */
754 000000 #define UCTXBRK (0x02) /* Send
next Data as Break */
755 000000 #define UCSWRST (0x01) /* USCI
Software Reset */
756 000000
757 000000 // SPI-Mode Bits
758 000000 //#define res (0x20) /*
reserved */
759 000000 //#define res (0x10) /*
reserved */
760 000000 //#define res (0x08) /*
reserved */
761 000000 //#define res (0x04) /*
reserved */
762 000000 //#define res (0x02) /*
reserved */
763 000000
764 000000 // I2C-Mode Bits
765 000000 //#define res (0x20) /*
reserved */
766 000000 #define UCTR (0x10) /*
Transmit/Receive Select/Flag */
767 000000 #define UCTXNACK (0x08) /*
Transmit NACK */
768 000000 #define UCTXSTP (0x04) /*
Transmit STOP */
769 000000 #define UCTXSTT (0x02) /*
Transmit START */
770 000000 #define UCSSEL_0 (0x00) /* USCI 0
Clock Source: 0 */
771 000000 #define UCSSEL_1 (0x40) /* USCI 0
Clock Source: 1 */
772 000000 #define UCSSEL_2 (0x80) /* USCI 0
Clock Source: 2 */
773 000000 #define UCSSEL_3 (0xC0) /* USCI 0
Clock Source: 3 */
774 000000
775 000000 #define UCBRF3 (0x80) /* USCI
First Stage Modulation Select 3 */
776 000000 #define UCBRF2 (0x40) /* USCI
First Stage Modulation Select 2 */
777 000000 #define UCBRF1 (0x20) /* USCI
First Stage Modulation Select 1 */
778 000000 #define UCBRF0 (0x10) /* USCI
First Stage Modulation Select 0 */
779 000000 #define UCBRS2 (0x08) /* USCI
Second Stage Modulation Select 2 */
780 000000 #define UCBRS1 (0x04) /* USCI
Second Stage Modulation Select 1 */
781 000000 #define UCBRS0 (0x02) /* USCI
Second Stage Modulation Select 0 */
782 000000 #define UCOS16 (0x01) /* USCI
16-times Oversampling enable */
783 000000
784 000000 #define UCBRF_0 (0x00) /* USCI
First Stage Modulation: 0 */
785 000000 #define UCBRF_1 (0x10) /* USCI
First Stage Modulation: 1 */
786 000000 #define UCBRF_2 (0x20) /* USCI
First Stage Modulation: 2 */
787 000000 #define UCBRF_3 (0x30) /* USCI
First Stage Modulation: 3 */
788 000000 #define UCBRF_4 (0x40) /* USCI
First Stage Modulation: 4 */
789 000000 #define UCBRF_5 (0x50) /* USCI
First Stage Modulation: 5 */
790 000000 #define UCBRF_6 (0x60) /* USCI
First Stage Modulation: 6 */
791 000000 #define UCBRF_7 (0x70) /* USCI
First Stage Modulation: 7 */
792 000000 #define UCBRF_8 (0x80) /* USCI
First Stage Modulation: 8 */
793 000000 #define UCBRF_9 (0x90) /* USCI
First Stage Modulation: 9 */
794 000000 #define UCBRF_10 (0xA0) /* USCI
First Stage Modulation: A */
795 000000 #define UCBRF_11 (0xB0) /* USCI
First Stage Modulation: B */
796 000000 #define UCBRF_12 (0xC0) /* USCI
First Stage Modulation: C */
797 000000 #define UCBRF_13 (0xD0) /* USCI
First Stage Modulation: D */
798 000000 #define UCBRF_14 (0xE0) /* USCI
First Stage Modulation: E */
799 000000 #define UCBRF_15 (0xF0) /* USCI
First Stage Modulation: F */
800 000000
801 000000 #define UCBRS_0 (0x00) /* USCI
Second Stage Modulation: 0 */
802 000000 #define UCBRS_1 (0x02) /* USCI
Second Stage Modulation: 1 */
803 000000 #define UCBRS_2 (0x04) /* USCI
Second Stage Modulation: 2 */
804 000000 #define UCBRS_3 (0x06) /* USCI
Second Stage Modulation: 3 */
805 000000 #define UCBRS_4 (0x08) /* USCI
Second Stage Modulation: 4 */
806 000000 #define UCBRS_5 (0x0A) /* USCI
Second Stage Modulation: 5 */
807 000000 #define UCBRS_6 (0x0C) /* USCI
Second Stage Modulation: 6 */
808 000000 #define UCBRS_7 (0x0E) /* USCI
Second Stage Modulation: 7 */
809 000000
810 000000 #define UCLISTEN (0x80) /* USCI
Listen mode */
811 000000 #define UCFE (0x40) /* USCI
Frame Error Flag */
812 000000 #define UCOE (0x20) /* USCI
Overrun Error Flag */
813 000000 #define UCPE (0x10) /* USCI
Parity Error Flag */
814 000000 #define UCBRK (0x08) /* USCI
Break received */
815 000000 #define UCRXERR (0x04) /* USCI RX
Error Flag */
816 000000 #define UCADDR (0x02) /* USCI
Address received Flag */
817 000000 #define UCBUSY (0x01) /* USCI
Busy Flag */
818 000000 #define UCIDLE (0x02) /* USCI
Idle line detected Flag */
819 000000
820 000000 //#define res (0x80) /*
reserved */
821 000000 //#define res (0x40) /*
reserved */
822 000000 //#define res (0x20) /*
reserved */
823 000000 //#define res (0x10) /*
reserved */
824 000000 #define UCNACKIE (0x08) /* NACK
Condition interrupt enable */
825 000000 #define UCSTPIE (0x04) /* STOP
Condition interrupt enable */
826 000000 #define UCSTTIE (0x02) /* START
Condition interrupt enable */
827 000000 #define UCALIE (0x01) /*
Arbitration Lost interrupt enable */
828 000000
829 000000 #define UCSCLLOW (0x40) /* SCL low
*/
830 000000 #define UCGC (0x20) /* General
Call address received Flag */
831 000000 #define UCBBUSY (0x10) /* Bus
Busy Flag */
832 000000 #define UCNACKIFG (0x08) /* NAK
Condition interrupt Flag */
833 000000 #define UCSTPIFG (0x04) /* STOP
Condition interrupt Flag */
834 000000 #define UCSTTIFG (0x02) /* START
Condition interrupt Flag */
835 000000 #define UCALIFG (0x01) /*
Arbitration Lost interrupt Flag */
836 000000
837 000000 #define UCIRTXPL5 (0x80) /* IRDA
Transmit Pulse Length 5 */
838 000000 #define UCIRTXPL4 (0x40) /* IRDA
Transmit Pulse Length 4 */
839 000000 #define UCIRTXPL3 (0x20) /* IRDA
Transmit Pulse Length 3 */
840 000000 #define UCIRTXPL2 (0x10) /* IRDA
Transmit Pulse Length 2 */
841 000000 #define UCIRTXPL1 (0x08) /* IRDA
Transmit Pulse Length 1 */
842 000000 #define UCIRTXPL0 (0x04) /* IRDA
Transmit Pulse Length 0 */
843 000000 #define UCIRTXCLK (0x02) /* IRDA
Transmit Pulse Clock Select */
844 000000 #define UCIREN (0x01) /* IRDA
Encoder/Decoder enable */
845 000000
846 000000 #define UCIRRXFL5 (0x80) /* IRDA
Receive Filter Length 5 */
847 000000 #define UCIRRXFL4 (0x40) /* IRDA
Receive Filter Length 4 */
848 000000 #define UCIRRXFL3 (0x20) /* IRDA
Receive Filter Length 3 */
849 000000 #define UCIRRXFL2 (0x10) /* IRDA
Receive Filter Length 2 */
850 000000 #define UCIRRXFL1 (0x08) /* IRDA
Receive Filter Length 1 */
851 000000 #define UCIRRXFL0 (0x04) /* IRDA
Receive Filter Length 0 */
852 000000 #define UCIRRXPL (0x02) /* IRDA
Receive Input Polarity */
853 000000 #define UCIRRXFE (0x01) /* IRDA
Receive Filter enable */
854 000000
855 000000 //#define res (0x80) /*
reserved */
856 000000 //#define res (0x40) /*
reserved */
857 000000 #define UCDELIM1 (0x20) /* Break
Sync Delimiter 1 */
858 000000 #define UCDELIM0 (0x10) /* Break
Sync Delimiter 0 */
859 000000 #define UCSTOE (0x08) /*
Sync-Field Timeout error */
860 000000 #define UCBTOE (0x04) /* Break
Timeout error */
861 000000 //#define res (0x02) /*
reserved */
862 000000 #define UCABDEN (0x01) /* Auto
Baud Rate detect enable */
863 000000
864 000000 #define UCGCEN (0x8000u) /* I2C
General Call enable */
865 000000 #define UCOA9 (0x0200u) /* I2C
Own Address 9 */
866 000000 #define UCOA8 (0x0100u) /* I2C
Own Address 8 */
867 000000 #define UCOA7 (0x0080u) /* I2C
Own Address 7 */
868 000000 #define UCOA6 (0x0040u) /* I2C
Own Address 6 */
869 000000 #define UCOA5 (0x0020u) /* I2C
Own Address 5 */
870 000000 #define UCOA4 (0x0010u) /* I2C
Own Address 4 */
871 000000 #define UCOA3 (0x0008u) /* I2C
Own Address 3 */
872 000000 #define UCOA2 (0x0004u) /* I2C
Own Address 2 */
873 000000 #define UCOA1 (0x0002u) /* I2C
Own Address 1 */
874 000000 #define UCOA0 (0x0001u) /* I2C
Own Address 0 */
875 000000
876 000000 #define UCSA9 (0x0200u) /* I2C
Slave Address 9 */
877 000000 #define UCSA8 (0x0100u) /* I2C
Slave Address 8 */
878 000000 #define UCSA7 (0x0080u) /* I2C
Slave Address 7 */
879 000000 #define UCSA6 (0x0040u) /* I2C
Slave Address 6 */
880 000000 #define UCSA5 (0x0020u) /* I2C
Slave Address 5 */
881 000000 #define UCSA4 (0x0010u) /* I2C
Slave Address 4 */
882 000000 #define UCSA3 (0x0008u) /* I2C
Slave Address 3 */
883 000000 #define UCSA2 (0x0004u) /* I2C
Slave Address 2 */
884 000000 #define UCSA1 (0x0002u) /* I2C
Slave Address 1 */
885 000000 #define UCSA0 (0x0001u) /* I2C
Slave Address 0 */
886 000000
887 000000 /***********************************************
*************
888 000000 * WATCHDOG TIMER
889 000000 ************************************************
************/
890 000000 #define __MSP430_HAS_WDT__ /*
Definition to show that Module is available
*/
891 000000
892 000000 #define WDTCTL_ (0x0120u) /*
Watchdog Timer Control */
893 000000 DEFW( WDTCTL , WDTCTL_)
894 000000 /* The bit names have been prefixed with "WDT"
*/
895 000000 #define WDTIS0 (0x0001u)
896 000000 #define WDTIS1 (0x0002u)
897 000000 #define WDTSSEL (0x0004u)
898 000000 #define WDTCNTCL (0x0008u)
899 000000 #define WDTTMSEL (0x0010u)
900 000000 #define WDTNMI (0x0020u)
901 000000 #define WDTNMIES (0x0040u)
902 000000 #define WDTHOLD (0x0080u)
903 000000
904 000000 #define WDTPW (0x5A00u)
905 000000
906 000000 /* WDT-interval times [1ms] coded with Bits 0-2
*/
907 000000 /* WDT is clocked by fSMCLK (assumed 1MHz)
*/
908 000000 #define WDT_MDLY_32 (WDTPW+WDTTMSEL+WDTC
NTCL) /* 32ms interval
(default) */
909 000000 #define WDT_MDLY_8 (WDTPW+WDTTMSEL+WDTC
NTCL+WDTIS0) /* 8ms "
*/
910 000000 #define WDT_MDLY_0_5 (WDTPW+WDTTMSEL+WDTC
NTCL+WDTIS1) /* 0.5ms "
*/
911 000000 #define WDT_MDLY_0_064 (WDTPW+WDTTMSEL+WDTC
NTCL+WDTIS1+WDTIS0) /* 0.064ms "
*/
912 000000 /* WDT is clocked by fACLK (assumed 32KHz)
*/
913 000000 #define WDT_ADLY_1000 (WDTPW+WDTTMSEL+WDTC
NTCL+WDTSSEL) /* 1000ms "
*/
914 000000 #define WDT_ADLY_250 (WDTPW+WDTTMSEL+WDTC
NTCL+WDTSSEL+WDTIS0) /* 250ms "
*/
915 000000 #define WDT_ADLY_16 (WDTPW+WDTTMSEL+WDTC
NTCL+WDTSSEL+WDTIS1) /* 16ms "
*/
916 000000 #define WDT_ADLY_1_9 (WDTPW+WDTTMSEL+WDTC
NTCL+WDTSSEL+WDTIS1+WDTIS0) /* 1.9ms "
*/
917 000000 /* Watchdog mode -> reset after expired time
*/
918 000000 /* WDT is clocked by fSMCLK (assumed 1MHz)
*/
919 000000 #define WDT_MRST_32 (WDTPW+WDTCNTCL)
/* 32ms interval
(default) */
920 000000 #define WDT_MRST_8 (WDTPW+WDTCNTCL+WDTI
S0) /* 8ms "
*/
921 000000 #define WDT_MRST_0_5 (WDTPW+WDTCNTCL+WDTI
S1) /* 0.5ms "
*/
922 000000 #define WDT_MRST_0_064 (WDTPW+WDTCNTCL+WDTI
S1+WDTIS0) /* 0.064ms "
*/
923 000000 /* WDT is clocked by fACLK (assumed 32KHz)
*/
924 000000 #define WDT_ARST_1000 (WDTPW+WDTCNTCL+WDTS
SEL) /* 1000ms "
*/
925 000000 #define WDT_ARST_250 (WDTPW+WDTCNTCL+WDTS
SEL+WDTIS0) /* 250ms "
*/
926 000000 #define WDT_ARST_16 (WDTPW+WDTCNTCL+WDTS
SEL+WDTIS1) /* 16ms "
*/
927 000000 #define WDT_ARST_1_9 (WDTPW+WDTCNTCL+WDTS
SEL+WDTIS1+WDTIS0) /* 1.9ms "
*/
928 000000
929 000000 /* INTERRUPT CONTROL */
930 000000 /* These two bits are defined in the Special
Function Registers */
931 000000 /* #define WDTIE 0x01 */
932 000000 /* #define WDTIFG 0x01 */
933 000000
934 000000 /***********************************************
*************
935 000000 * Calibration Data in Info Mem
936 000000 ************************************************
************/
937 000000
938 000000 #ifndef __DisableCalData
939 000000
940 000000 #define CALDCO_16MHZ_ (0x10F8u) /*
DCOCTL Calibration Data for 16MHz */
941 000000 READ_ONLY DEFC( CALDCO_16MHZ , CALDCO_16MHZ_
)
942 000000 #define CALBC1_16MHZ_ (0x10F9u) /*
BCSCTL1 Calibration Data for 16MHz */
943 000000 READ_ONLY DEFC( CALBC1_16MHZ , CALBC1_16MHZ_
)
944 000000 #define CALDCO_12MHZ_ (0x10FAu) /*
DCOCTL Calibration Data for 12MHz */
945 000000 READ_ONLY DEFC( CALDCO_12MHZ , CALDCO_12MHZ_
)
946 000000 #define CALBC1_12MHZ_ (0x10FBu) /*
BCSCTL1 Calibration Data for 12MHz */
947 000000 READ_ONLY DEFC( CALBC1_12MHZ , CALBC1_12MHZ_
)
948 000000 #define CALDCO_8MHZ_ (0x10FCu) /*
DCOCTL Calibration Data for 8MHz */
949 000000 READ_ONLY DEFC( CALDCO_8MHZ , CALDCO_8MHZ_)
950 000000 #define CALBC1_8MHZ_ (0x10FDu) /*
BCSCTL1 Calibration Data for 8MHz */
951 000000 READ_ONLY DEFC( CALBC1_8MHZ , CALBC1_8MHZ_)
952 000000 #define CALDCO_1MHZ_ (0x10FEu) /*
DCOCTL Calibration Data for 1MHz */
953 000000 READ_ONLY DEFC( CALDCO_1MHZ , CALDCO_1MHZ_)
954 000000 #define CALBC1_1MHZ_ (0x10FFu) /*
BCSCTL1 Calibration Data for 1MHz */
955 000000 READ_ONLY DEFC( CALBC1_1MHZ , CALBC1_1MHZ_)
956 000000
957 000000 #endif /* #ifndef __DisableCalData */
958 000000
959 000000 /***********************************************
*************
960 000000 * Interrupt Vectors (offset from 0xFFE0)
961 000000 ************************************************
************/
962 000000
963 000000 #define PORT1_VECTOR (2 * 2u) /* 0xFFE4
Port 1 */
964 000000 #define PORT2_VECTOR (3 * 2u) /* 0xFFE6
Port 2 */
965 000000 #define ADC10_VECTOR (5 * 2u) /* 0xFFEA
ADC10 */
966 000000 #define USCIAB0TX_VECTOR (6 * 2u) /* 0xFFEC
USCI A0/B0 Transmit */
967 000000 #define USCIAB0RX_VECTOR (7 * 2u) /* 0xFFEE
USCI A0/B0 Receive */
968 000000 #define TIMER0_A1_VECTOR (8 * 2u) /* 0xFFF0
Timer0)A CC1, TA0 */
969 000000 #define TIMER0_A0_VECTOR (9 * 2u) /* 0xFFF2
Timer0_A CC0 */
970 000000 #define WDT_VECTOR (10 * 2u) /* 0xFFF4
Watchdog Timer */
971 000000 #define COMPARATORA_VECTOR (11 * 2u) /* 0xFFF6
Comparator A */
972 000000 #define TIMER1_A1_VECTOR (12 * 2u) /* 0xFFF8
Timer1_A CC1-4, TA1 */
973 000000 #define TIMER1_A0_VECTOR (13 * 2u) /* 0xFFFA
Timer1_A CC0 */
974 000000 #define NMI_VECTOR (14 * 2u) /* 0xFFFC
Non-maskable */
975 000000 #define RESET_VECTOR (15 * 2u) /* 0xFFFE
Reset [Highest Priority] */
976 000000
977 000000 /***********************************************
*************
978 000000 * End of Modules
979 000000 ************************************************
************/
980 000000 #pragma language=default
981 000000
982 000000 #endif /* #ifndef __MSP430G2553 */
983 000000
986 000000
987 000000 #elif defined (__MSP430G2203__)
988 000000 #include "msp430g2203.h"
990 000000 #elif defined (__MSP430G2303__)
991 000000 #include "msp430g2303.h"
993 000000 #elif defined (__MSP430G2403__)
994 000000 #include "msp430g2403.h"
996 000000 #elif defined (__MSP430G2233__)
997 000000 #include "msp430g2233.h"
999 000000 #elif defined (__MSP430G2333__)
1000 000000 #include "msp430g2333.h"
1002 000000 #elif defined (__MSP430G2433__)
1003 000000 #include "msp430g2433.h"
1005 000000 #elif defined (__MSP430G2533__)
1006 000000 #include "msp430g2533.h"
1008 000000 #elif defined (__MSP430BT5190__)
1009 000000 #include "msp430bt5190.h"
1014 000000 #elif defined (__MSP430GENERIC__)
1015 000000 #error "msp430 generic device does not have a
default include file"
1017 000000 #elif defined (__MSP430XGENERIC__)
1018 000000 #error "msp430X generic device does not have a
default include file"
1024 000000 #else
1025 000000 #error "Failed to match a default include
file"
1026 000000 #endif
1027 000000
1028 000000 #endif /* #ifndef __msp430 */
1029 000000
29 000000 #include "CF430G2553forth.h" ;
header macros and register defs
1 000000 ; ----------------------------------------------
------------------------
2 000000 ; CF430G2553 is a Forth based on CamelForth
3 000000 ; for the Texas Instruments MSP430
4 000000 ;
5 000000 ; This program is free software; you can
redistribute it and/or modify
6 000000 ; it under the terms of the GNU General Public
License as published by
7 000000 ; the Free Software Foundation; either version 3
of the License, or
8 000000 ; (at your option) any later version.
9 000000 ;
10 000000 ; This program is distributed in the hope that
it will be useful,
11 000000 ; but WITHOUT ANY WARRANTY; without even the
implied warranty of
12 000000 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the
13 000000 ; GNU General Public License for more details.
14 000000 ;
15 000000 ; You should have received a copy of the GNU
General Public License
16 000000 ; along with this program. If not, see
.
17 000000 ;
18 000000 ; See LICENSE TERMS in Brads file readme.txt as
well.
19 000000
20 000000 ; ----------------------------------------------
------------------------
21 000000 ; CF430G2553forth.h: - Register, Model, Macro
declarations - MSP430G2553
22 000000 ; ----------------------------------------------
------------------------
23 000000
24 000000 // ; FORTH MEMORY USAGE
25 000000 // ; for Flash memory operations - this includes
information and main
26 000000 // ; ROM, but not the main ROM used by the
kernel (above E000h)
27 000000 #define INFOSTART (0x1000) // ok mk
28 000000 #define INFOEND (0x10FF) // ok mk
29 000000 #define RAMSTART (0x0200) // ok mk
30 000000 #define RAMEND (0x03FF) // ok mk
31 000000 #define FLASHSTART (0xC000) // ok mk
32 000000 #define FLASHEND (0xDFFF) // ok mk
33 000000 #define MAINSEG (512) // wozu ?? mk
34 000000 #define INFOSEG (128) // ?? mk
35 000000
36 000000 // ; FORTH REGISTER USAGE
37 000000
38 000000 // ; Forth virtual machine
39 000000 #define RSP SP
40 000000 #define PSP R4
41 000000 #define IP R5
42 000000 #define W R6
43 000000 #define TOS R7
44 000000
45 000000 // ; Loop parameters in registers
46 000000 #define INDEX R8
47 000000 #define LIMIT R9
48 000000
49 000000 // ; Scratch registers
50 000000 #define X R10
51 000000 #define Y R11
52 000000 #define Q R12
53 000000 #define T R13
54 000000
55 000000 // ; T.I. Integer Subroutines Definitions
56 000000 #define IROP1 TOS
57 000000 #define IROP2L R10
58 000000 #define IROP2M R11
59 000000 #define IRACL R12
60 000000 #define IRACM R13
61 000000 #define IRBT W
62 000000
63 000000 // ; INDIRECT-THREADED NEXT
64 000000
69 000000
70 000000 // ; BRANCH DESTINATION (RELATIVE BRANCH)
71 000000 // ; For relative branch addresses, i.e., a
branch is ADD @IP,IP
72 000000
76 000000
77 000000 // ; HEADER CONSTRUCTION MACROS
78 000000
93 000000
102 000000
117 000000
30 000000
31 000000 EXTERN UP,UAREA,PADAREA,LSTACK,PSTACK,R
STACK
32 000000 EXTERN TIBAREA,RAMDICT,ROMDICT
33 000000 EXTERN TIB_SIZE,UAREA_SIZE,nullirq
34 000000
35 000000 RSEG CODE ; place
program in 'CODE' segment
36 000000
37 000000 link SET 0 ; initial dictionary
link
38 000000
39 000000 version:
40 000000 1F DB (verend-ver0)
41 000001 434634333047*ver0: DB 'CF430G2553 v0.34 ',__date__,'|'
42 00001F 00 EVEN
43 000020 verend:
44 000020
45 000020 ; ----------------------------------------------
------------------------
46 000020 ; INTERPRETER LOGIC
47 000020 ; ITC NEXT is defined as
48 000020 ; MOV @IP+,W ; 2 fetch word address
into W
49 000020 ; MOV @W+,PC ; 2 fetch code address
into PC, W=PFA
50 000020
51 000020 ;C EXECUTE i*x xt -- j*x execute Forth
word
52 000020 ;C at 'xt'
53 000020 HEADER EXECUTE,7,'EXECUTE',DOCODE
53.1 000000 PUBLIC EXECUTE
53.2 000020 0000 DW link
53.3 000022 FF DB 0FFh ; not immediate
53.4 000023 link SET $
53.5 000023 07 DB 7
53.6 000024 455845435554* DB 'EXECUTE'
53.7 00002B 00 EVEN
53.8 00002C IF 'DOCODE'='DOCODE'
53.9 00002C .... EXECUTE: DW $+2
53.10 00002E ELSE
53.11 00002E EXECUTE: DW DOCODE
53.12 00002E ENDIF
53.13 00002E ENDM
54 00002E 0647 MOV TOS,W ; 1 put word address
into W
55 000030 3744 MOV @PSP+,TOS ; 2 fetch new TOS
56 000032 3046 MOV @W+,PC ; 2 fetch code address
into PC, W=PFA
57 000034
58 000034 ;Z lit -- x fetch inline literal to
stack
59 000034 ; This is the primtive compiled by LITERAL.
60 000034 HEADER lit,3,'lit',DOCODE
60.1 000000 PUBLIC lit
60.2 000034 .... DW link
60.3 000036 FF DB 0FFh ; not immediate
60.4 000037 link SET $
60.5 000037 03 DB 3
60.6 000038 6C6974 DB 'lit'
60.7 00003B 00 EVEN
60.8 00003C IF 'DOCODE'='DOCODE'
60.9 00003C .... lit: DW $+2
60.10 00003E ELSE
60.11 00003E lit: DW DOCODE
60.12 00003E ENDIF
60.13 00003E ENDM
61 00003E 2483 SUB #2,PSP ; 1 push old TOS..
62 000040 84470000 MOV TOS,0(PSP) ; 4 ..onto stack
63 000044 3745 MOV @IP+,TOS ; 2 fetch new TOS
value
64 000046 NEXT ; 4
64.1 000046 3645 MOV @IP+,W // ; fetch word address
into W
64.2 000048 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
64.3 00004A ENDM
65 00004A
66 00004A ;C EXIT -- exit a colon
definition
67 00004A HEADER EXIT,4,'EXIT',DOCODE
67.1 000000 PUBLIC EXIT
67.2 00004A .... DW link
67.3 00004C FF DB 0FFh ; not immediate
67.4 00004D link SET $
67.5 00004D 04 DB 4
67.6 00004E 45584954 DB 'EXIT'
67.7 000052 EVEN
67.8 000052 IF 'DOCODE'='DOCODE'
67.9 000052 .... EXIT: DW $+2
67.10 000054 ELSE
67.11 000054 EXIT: DW DOCODE
67.12 000054 ENDIF
67.13 000054 ENDM
68 000054 3541 MOV @RSP+,IP ; 2 pop old IP from
return stack
69 000056 NEXT ; 4
69.1 000056 3645 MOV @IP+,W // ; fetch word address
into W
69.2 000058 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
69.3 00005A ENDM
70 00005A
71 00005A ; ----------------------------------------------
------------------------
72 00005A ; DEFINING WORDS - ROMable ITC model
73 00005A
74 00005A ; DOCOLON enters a new high-level thread (colon
definition.)
75 00005A ; (internal code fragment, not a Forth
word)
76 000000 PUBLIC DOCOLON
77 00005A DOCOLON:
78 00005A 0512 PUSH IP ; 3 save old IP on
return stack
79 00005C 0546 MOV W,IP ; 1 set new IP to
PFA
80 00005E NEXT ; 4
80.1 00005E 3645 MOV @IP+,W // ; fetch word address
into W
80.2 000060 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
80.3 000062 ENDM
81 000062
82 000062 ;C VARIABLE -- define a Forth
VARIABLE
83 000062 ; CREATE CELL ALLOT ;
84 000062 ; Action of ROMable variable is the same as
CREATE; it builds a
85 000062 ; constant holding the RAM address. See CREATE
in hilvl430.s43.
86 000062 HEADER VARIABLE,8,'VARIABLE',DOCOLON
86.1 000000 PUBLIC VARIABLE
86.2 000062 .... DW link
86.3 000064 FF DB 0FFh ; not immediate
86.4 000065 link SET $
86.5 000065 08 DB 8
86.6 000066 564152494142* DB 'VARIABLE'
86.7 00006E EVEN
86.8 00006E IF 'DOCOLON'='DOCODE'
86.9 00006E VARIABLE: DW $+2
86.10 00006E ELSE
86.11 00006E .... VARIABLE: DW DOCOLON
86.12 000070 ENDIF
86.13 000070 ENDM
87 000070 ............* DW CREATE,CELL,ALLOT,EXIT
88 000078
89 000078 ;C CONSTANT -- define a Forth
constant
90 000078 ; (machine code fragment)
92 000078 ; Note that the constant is stored in Code
space.
93 000078 HEADER CONSTANT,8,'CONSTANT',DOCOLON
93.1 000000 PUBLIC CONSTANT
93.2 000078 .... DW link
93.3 00007A FF DB 0FFh ; not immediate
93.4 00007B link SET $
93.5 00007B 08 DB 8
93.6 00007C 434F4E535441* DB 'CONSTANT'
93.7 000084 EVEN
93.8 000084 IF 'DOCOLON'='DOCODE'
93.9 000084 CONSTANT: DW $+2
93.10 000084 ELSE
93.11 000084 .... CONSTANT: DW DOCOLON
93.12 000086 ENDIF
93.13 000086 ENDM
94 000086 ............ DW BUILDS,ICOMMA,XDOES
95 00008C ; DOCON, code action of CONSTANT,
96 00008C ; entered with W=Parameter Field Adrs
97 00008C ; This is also the action of VARIABLE (Harvard
model)
98 00008C ; This is also the action of CREATE (Harvard
model)
99 000000 PUBLIC DOCON
100 000000 PUBLIC docreate
101 000000 PUBLIC DOVAR
102 00008C docreate: ; -- a-addr ; ROMable CREATE fetches
address from PFA
103 00008C DOVAR: ; -- a-addr ; ROMable VARIABLE
fetches address from PFA
104 00008C DOCON: ; -- x ; CONSTANT fetches cell
from PFA to TOS
105 00008C 2483 SUB #2,PSP ; make room on
stack
106 00008E 84470000 MOV TOS,0(PSP)
107 000092 2746 MOV @W,TOS ; fetch from parameter
field to TOS
108 000094 NEXT
108.1 000094 3645 MOV @IP+,W // ; fetch word address
into W
108.2 000096 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
108.3 000098 ENDM
109 000098
110 000098 ; DOCREATE's action is for a table in RAM.
111 000098 ; DOROM is the code action for a table in
ROM;
112 000098 ; it returns the address of the parameter
field.
113 000000 PUBLIC DOROM
114 000098 DOROM: ; -- a-addr ; Table in ROM: get PFA
into TOS
115 000098 2483 SUB #2,PSP
116 00009A 84470000 MOV TOS,0(PSP)
117 00009E 0746 MOV W,TOS
118 0000A0 NEXT
118.1 0000A0 3645 MOV @IP+,W // ; fetch word address
into W
118.2 0000A2 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
118.3 0000A4 ENDM
119 0000A4
120 0000A4 ;Z USER n -- define user variable
'n'
121 0000A4 ; (machine code fragment)
Flashable model
122 0000A4 HEADER USER,4,'USER',DOCOLON
122.1 000000 PUBLIC USER
122.2 0000A4 .... DW link
122.3 0000A6 FF DB 0FFh ; not immediate
122.4 0000A7 link SET $
122.5 0000A7 04 DB 4
122.6 0000A8 55534552 DB 'USER'
122.7 0000AC EVEN
122.8 0000AC IF 'DOCOLON'='DOCODE'
122.9 0000AC USER: DW $+2
122.10 0000AC ELSE
122.11 0000AC .... USER: DW DOCOLON
122.12 0000AE ENDIF
122.13 0000AE ENDM
123 0000AE ............ DW BUILDS,ICOMMA,XDOES
124 000000 PUBLIC DOUSER
125 0000B4 DOUSER: ; -- a-addr ; add constant to User
Pointer, result in TOS
126 0000B4 2483 SUB #2,PSP
127 0000B6 84470000 MOV TOS,0(PSP)
128 0000BA 2746 MOV @W,TOS
129 0000BC 1752.... ADD &UP,TOS
130 0000C0 NEXT
130.1 0000C0 3645 MOV @IP+,W // ; fetch word address
into W
130.2 0000C2 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
130.3 0000C4 ENDM
131 0000C4
132 0000C4 ; DOALIAS used to build a word which performs
the action of
133 0000C4 ; another word. Its action is to fetch the
"alias" CFA from
134 0000C4 ; the parameter field, and execute that, e.g.
DOES> I@ EXECUTE ;
135 0000C4 ; This is currently used only within the Forth
kernel.
136 000000 PUBLIC DOALIAS
137 0000C4 DOALIAS: ; -- ; fetch CFA of word to
execute
138 0000C4 2646 MOV @W,W ; 2 fetch from parameter
field to W
139 0000C6 3046 MOV @W+,PC ; 2 fetch code address
into PC, W=PFA
140 0000C8
141 0000C8 ; DODOES is the code action of a DOES> clause.
For ITC Forth:
142 0000C8 ; defined word: CFA: doescode
143 0000C8 ; PFA: parameter field
144 0000C8 ;
145 0000C8 ; doescode: MOV #DODOES,PC ; 16-bit direct
jump, in two cells
146 0000C8 ; high-level thread
147 0000C8 ;
148 0000C8 ; Note that we use JMP DODOES instead of CALL
#DODOES because we can
149 0000C8 ; efficiently obtain the thread address. DODOES
is entered with W=PFA.
150 0000C8 ; It enters the high-level thread with the
address of the parameter
151 0000C8 ; field on top of stack.
152 0000C8
153 000000 PUBLIC dodoes
154 0000C8 dodoes: ; -- a-addr ; 3 for MOV #DODOES,PC
155 0000C8 2483 SUB #2,PSP ; 1 make room on
stack
156 0000CA 84470000 MOV TOS,0(PSP) ; 4
157 0000CE 0746 MOV W,TOS ; 1 put defined word's
PFA in TOS
158 0000D0 0512 PUSH IP ; 3 save old IP on
return stack
159 0000D2 1546FEFF MOV -2(W),IP ; 3 fetch adrs of
doescode from defined
word
160 0000D6 2552 ADD #4,IP ; 1 skip MOV instruction
to get thread
adrs
161 0000D8 NEXT ; 4
161.1 0000D8 3645 MOV @IP+,W // ; fetch word address
into W
161.2 0000DA 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
161.3 0000DC ENDM
162 0000DC
163 0000DC ; OPTION 1 ; OPTION 2
164 0000DC ; MOV #DODOES,PC 3 ; CALL #DODOES
5
165 0000DC ; ... ; ...
166 0000DC ; PUSH IP 3 ; POP W
2
167 0000DC ; MOVE -2(W),IP 3 ; PUSH IP
3
168 0000DC ; ADD #4,IP 1 ; MOV W,IP
1
169 0000DC
170 0000DC
171 0000DC ; ----------------------------------------------
------------------------
172 0000DC ; STACK OPERATIONS
173 0000DC
174 0000DC ;C DUP x -- x x duplicate top of
stack
175 0000DC HEADER DUP,3,'DUP',DOCODE
175.1 000000 PUBLIC DUP
175.2 0000DC .... DW link
175.3 0000DE FF DB 0FFh ; not immediate
175.4 0000DF link SET $
175.5 0000DF 03 DB 3
175.6 0000E0 445550 DB 'DUP'
175.7 0000E3 00 EVEN
175.8 0000E4 IF 'DOCODE'='DOCODE'
175.9 0000E4 .... DUP: DW $+2
175.10 0000E6 ELSE
175.11 0000E6 DUP: DW DOCODE
175.12 0000E6 ENDIF
175.13 0000E6 ENDM
176 0000E6 2483 PUSHTOS: SUB #2,PSP ; 1 push old
TOS..
177 0000E8 84470000 MOV TOS,0(PSP) ; 4 ..onto
stack
178 0000EC NEXT ; 4
178.1 0000EC 3645 MOV @IP+,W // ; fetch word address
into
W
178.2 0000EE 3046 MOV @W+,PC // ; fetch code address
into PC,
W=PFA
178.3 0000F0 ENDM
179 0000F0
180 0000F0 ;C ?DUP x -- 0 | x x DUP if nonzero
181 0000F0 HEADER QDUP,4,'?DUP',DOCODE
181.1 000000 PUBLIC QDUP
181.2 0000F0 .... DW link
181.3 0000F2 FF DB 0FFh ; not immediate
181.4 0000F3 link SET $
181.5 0000F3 04 DB 4
181.6 0000F4 3F445550 DB '?DUP'
181.7 0000F8 EVEN
181.8 0000F8 IF 'DOCODE'='DOCODE'
181.9 0000F8 .... QDUP: DW $+2
181.10 0000FA ELSE
181.11 0000FA QDUP: DW DOCODE
181.12 0000FA ENDIF
181.13 0000FA ENDM
182 0000FA 0793 CMP #0,TOS ; 1 test for
TOS nonzero
183 0000FC F423 JNZ PUSHTOS ; 2
184 0000FE NODUP: NEXT ; 4
184.1 0000FE 3645 MOV @IP+,W // ; fetch word address
into
W
184.2 000100 3046 MOV @W+,PC // ; fetch code address
into PC,
W=PFA
184.3 000102 ENDM
185 000102
186 000102 ;C DROP x -- drop top of stack
187 000102 HEADER DROP,4,'DROP',DOCODE
187.1 000000 PUBLIC DROP
187.2 000102 .... DW link
187.3 000104 FF DB 0FFh ; not immediate
187.4 000105 link SET $
187.5 000105 04 DB 4
187.6 000106 44524F50 DB 'DROP'
187.7 00010A EVEN
187.8 00010A IF 'DOCODE'='DOCODE'
187.9 00010A .... DROP: DW $+2
187.10 00010C ELSE
187.11 00010C DROP: DW DOCODE
187.12 00010C ENDIF
187.13 00010C ENDM
188 00010C 3744 MOV @PSP+,TOS ; 2
189 00010E NEXT ; 4
189.1 00010E 3645 MOV @IP+,W // ; fetch word address
into
W
189.2 000110 3046 MOV @W+,PC // ; fetch code address
into PC,
W=PFA
189.3 000112 ENDM
190 000112
191 000112 ;C SWAP x1 x2 -- x2 x1 swap top two
items
192 000112 HEADER SWAP,4,'SWAP',DOCODE
192.1 000000 PUBLIC SWAP
192.2 000112 .... DW link
192.3 000114 FF DB 0FFh ; not immediate
192.4 000115 link SET $
192.5 000115 04 DB 4
192.6 000116 53574150 DB 'SWAP'
192.7 00011A EVEN
192.8 00011A IF 'DOCODE'='DOCODE'
192.9 00011A .... SWAP: DW $+2
192.10 00011C ELSE
192.11 00011C SWAP: DW DOCODE
192.12 00011C ENDIF
192.13 00011C ENDM
193 00011C 2644 MOV @PSP,W ; 2
194 00011E 84470000 MOV TOS,0(PSP) ; 4
195 000122 0746 MOV W,TOS ; 1
196 000124 NEXT ; 4
196.1 000124 3645 MOV @IP+,W // ; fetch word address
into
W
196.2 000126 3046 MOV @W+,PC // ; fetch code address
into PC,
W=PFA
196.3 000128 ENDM
197 000128
198 000128 ;C OVER x1 x2 -- x1 x2 x1 per stack
diagram
199 000128 HEADER OVER,4,'OVER',DOCODE
199.1 000000 PUBLIC OVER
199.2 000128 .... DW link
199.3 00012A FF DB 0FFh ; not immediate
199.4 00012B link SET $
199.5 00012B 04 DB 4
199.6 00012C 4F564552 DB 'OVER'
199.7 000130 EVEN
199.8 000130 IF 'DOCODE'='DOCODE'
199.9 000130 .... OVER: DW $+2
199.10 000132 ELSE
199.11 000132 OVER: DW DOCODE
199.12 000132 ENDIF
199.13 000132 ENDM
200 000132 2644 MOV @PSP,W ; 2
201 000134 2483 SUB #2,PSP ; 2
202 000136 84470000 MOV TOS,0(PSP) ; 4
203 00013A 0746 MOV W,TOS ; 1
204 00013C NEXT ; 4
204.1 00013C 3645 MOV @IP+,W // ; fetch word address
into
W
204.2 00013E 3046 MOV @W+,PC // ; fetch code address
into PC,
W=PFA
204.3 000140 ENDM
205 000140
206 000140 ;C ROT x1 x2 x3 -- x2 x3 x1 per stack
diagram
207 000140 HEADER ROT,3,'ROT',DOCODE
207.1 000000 PUBLIC ROT
207.2 000140 .... DW link
207.3 000142 FF DB 0FFh ; not immediate
207.4 000143 link SET $
207.5 000143 03 DB 3
207.6 000144 524F54 DB 'ROT'
207.7 000147 00 EVEN
207.8 000148 IF 'DOCODE'='DOCODE'
207.9 000148 .... ROT: DW $+2
207.10 00014A ELSE
207.11 00014A ROT: DW DOCODE
207.12 00014A ENDIF
207.13 00014A ENDM
208 00014A 2644 MOV @PSP,W ; 2 fetch
x2
209 00014C 84470000 MOV TOS,0(PSP) ; 4 store
x3
210 000150 17440200 MOV 2(PSP),TOS ; 3 fetch
x1
211 000154 84460200 MOV W,2(PSP) ; 4 store
x2
212 000158 NEXT ; 4
212.1 000158 3645 MOV @IP+,W // ; fetch word address
into
W
212.2 00015A 3046 MOV @W+,PC // ; fetch code address
into PC,
W=PFA
212.3 00015C ENDM
213 00015C
214 00015C ;X NIP x1 x2 -- x2 per stack
diagram
215 00015C HEADER NIP,3,'NIP',DOCODE
215.1 000000 PUBLIC NIP
215.2 00015C .... DW link
215.3 00015E FF DB 0FFh ; not immediate
215.4 00015F link SET $
215.5 00015F 03 DB 3
215.6 000160 4E4950 DB 'NIP'
215.7 000163 00 EVEN
215.8 000164 IF 'DOCODE'='DOCODE'
215.9 000164 .... NIP: DW $+2
215.10 000166 ELSE
215.11 000166 NIP: DW DOCODE
215.12 000166 ENDIF
215.13 000166 ENDM
216 000166 2453 ADD #2,PSP ; 1
217 000168 NEXT ; 4
217.1 000168 3645 MOV @IP+,W // ; fetch word address
into
W
217.2 00016A 3046 MOV @W+,PC // ; fetch code address
into PC,
W=PFA
217.3 00016C ENDM
218 00016C
219 00016C ;C >R x -- R: -- x push to return
stack
220 00016C HEADER TOR,2,'>R',DOCODE
220.1 000000 PUBLIC TOR
220.2 00016C .... DW link
220.3 00016E FF DB 0FFh ; not immediate
220.4 00016F link SET $
220.5 00016F 02 DB 2
220.6 000170 3E52 DB '>R'
220.7 000172 EVEN
220.8 000172 IF 'DOCODE'='DOCODE'
220.9 000172 .... TOR: DW $+2
220.10 000174 ELSE
220.11 000174 TOR: DW DOCODE
220.12 000174 ENDIF
220.13 000174 ENDM
221 000174 0712 PUSH TOS
222 000176 3744 MOV @PSP+,TOS
223 000178 NEXT
223.1 000178 3645 MOV @IP+,W // ; fetch word address
into W
223.2 00017A 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
223.3 00017C ENDM
224 00017C
225 00017C ;C R> -- x R: x -- pop from return
stack
226 00017C HEADER RFROM,2,'R>',DOCODE
226.1 000000 PUBLIC RFROM
226.2 00017C .... DW link
226.3 00017E FF DB 0FFh ; not immediate
226.4 00017F link SET $
226.5 00017F 02 DB 2
226.6 000180 523E DB 'R>'
226.7 000182 EVEN
226.8 000182 IF 'DOCODE'='DOCODE'
226.9 000182 .... RFROM: DW $+2
226.10 000184 ELSE
226.11 000184 RFROM: DW DOCODE
226.12 000184 ENDIF
226.13 000184 ENDM
227 000184 2483 SUB #2,PSP ; 2
228 000186 84470000 MOV TOS,0(PSP) ; 4
229 00018A 3741 MOV @RSP+,TOS
230 00018C NEXT
230.1 00018C 3645 MOV @IP+,W // ; fetch word address
into W
230.2 00018E 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
230.3 000190 ENDM
231 000190
232 000190 ;C R@ -- x R: x -- x fetch from rtn
stk
233 000190 HEADER RFETCH,2,'R@',DOCODE
233.1 000000 PUBLIC RFETCH
233.2 000190 .... DW link
233.3 000192 FF DB 0FFh ; not immediate
233.4 000193 link SET $
233.5 000193 02 DB 2
233.6 000194 5240 DB 'R@'
233.7 000196 EVEN
233.8 000196 IF 'DOCODE'='DOCODE'
233.9 000196 .... RFETCH: DW $+2
233.10 000198 ELSE
233.11 000198 RFETCH: DW DOCODE
233.12 000198 ENDIF
233.13 000198 ENDM
234 000198 2483 SUB #2,PSP
235 00019A 84470000 MOV TOS,0(PSP)
236 00019E 2741 MOV @RSP,TOS
237 0001A0 NEXT
237.1 0001A0 3645 MOV @IP+,W // ; fetch word address
into W
237.2 0001A2 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
237.3 0001A4 ENDM
238 0001A4
239 0001A4 ;Z SP@ -- a-addr get data stack
pointer
240 0001A4 HEADER SPFETCH,3,'SP@',DOCODE
240.1 000000 PUBLIC SPFETCH
240.2 0001A4 .... DW link
240.3 0001A6 FF DB 0FFh ; not immediate
240.4 0001A7 link SET $
240.5 0001A7 03 DB 3
240.6 0001A8 535040 DB 'SP@'
240.7 0001AB 00 EVEN
240.8 0001AC IF 'DOCODE'='DOCODE'
240.9 0001AC .... SPFETCH: DW $+2
240.10 0001AE ELSE
240.11 0001AE SPFETCH: DW DOCODE
240.12 0001AE ENDIF
240.13 0001AE ENDM
241 0001AE 2483 SUB #2,PSP
242 0001B0 84470000 MOV TOS,0(PSP)
243 0001B4 0744 MOV PSP,TOS
244 0001B6 NEXT
244.1 0001B6 3645 MOV @IP+,W // ; fetch word address
into W
244.2 0001B8 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
244.3 0001BA ENDM
245 0001BA
246 0001BA ;Z SP! a-addr -- set data stack
pointer
247 0001BA HEADER SPSTORE,3,'SP!',DOCODE
247.1 000000 PUBLIC SPSTORE
247.2 0001BA .... DW link
247.3 0001BC FF DB 0FFh ; not immediate
247.4 0001BD link SET $
247.5 0001BD 03 DB 3
247.6 0001BE 535021 DB 'SP!'
247.7 0001C1 00 EVEN
247.8 0001C2 IF 'DOCODE'='DOCODE'
247.9 0001C2 .... SPSTORE: DW $+2
247.10 0001C4 ELSE
247.11 0001C4 SPSTORE: DW DOCODE
247.12 0001C4 ENDIF
247.13 0001C4 ENDM
248 0001C4 0447 MOV TOS,PSP
249 0001C6 3744 MOV @PSP+,TOS ; 2
250 0001C8 NEXT
250.1 0001C8 3645 MOV @IP+,W // ; fetch word address
into W
250.2 0001CA 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
250.3 0001CC ENDM
251 0001CC
252 0001CC ;Z RP@ -- a-addr get return stack
pointer
253 0001CC HEADER RPFETCH,3,'RP@',DOCODE
253.1 000000 PUBLIC RPFETCH
253.2 0001CC .... DW link
253.3 0001CE FF DB 0FFh ; not immediate
253.4 0001CF link SET $
253.5 0001CF 03 DB 3
253.6 0001D0 525040 DB 'RP@'
253.7 0001D3 00 EVEN
253.8 0001D4 IF 'DOCODE'='DOCODE'
253.9 0001D4 .... RPFETCH: DW $+2
253.10 0001D6 ELSE
253.11 0001D6 RPFETCH: DW DOCODE
253.12 0001D6 ENDIF
253.13 0001D6 ENDM
254 0001D6 2483 SUB #2,PSP
255 0001D8 84470000 MOV TOS,0(PSP)
256 0001DC 0741 MOV RSP,TOS
257 0001DE NEXT
257.1 0001DE 3645 MOV @IP+,W // ; fetch word address
into W
257.2 0001E0 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
257.3 0001E2 ENDM
258 0001E2
259 0001E2 ;Z RP! a-addr -- set return stack
pointer
260 0001E2 HEADER RPSTORE,3,'RP!',DOCODE
260.1 000000 PUBLIC RPSTORE
260.2 0001E2 .... DW link
260.3 0001E4 FF DB 0FFh ; not immediate
260.4 0001E5 link SET $
260.5 0001E5 03 DB 3
260.6 0001E6 525021 DB 'RP!'
260.7 0001E9 00 EVEN
260.8 0001EA IF 'DOCODE'='DOCODE'
260.9 0001EA .... RPSTORE: DW $+2
260.10 0001EC ELSE
260.11 0001EC RPSTORE: DW DOCODE
260.12 0001EC ENDIF
260.13 0001EC ENDM
261 0001EC 0147 MOV TOS,RSP
262 0001EE 3744 MOV @PSP+,TOS ; 2
263 0001F0 NEXT
263.1 0001F0 3645 MOV @IP+,W // ; fetch word address
into W
263.2 0001F2 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
263.3 0001F4 ENDM
264 0001F4
265 0001F4 ;X TUCK x1 x2 -- x2 x1 x2 per stack
diagram
266 0001F4 HEADER TUCK,4,'TUCK',DOCOLON
266.1 000000 PUBLIC TUCK
266.2 0001F4 .... DW link
266.3 0001F6 FF DB 0FFh ; not immediate
266.4 0001F7 link SET $
266.5 0001F7 04 DB 4
266.6 0001F8 5455434B DB 'TUCK'
266.7 0001FC EVEN
266.8 0001FC IF 'DOCOLON'='DOCODE'
266.9 0001FC TUCK: DW $+2
266.10 0001FC ELSE
266.11 0001FC .... TUCK: DW DOCOLON
266.12 0001FE ENDIF
266.13 0001FE ENDM
267 0001FE ............ DC16 SWAP,OVER,EXIT
268 000204
269 000204 ; ----------------------------------------------
------------------------
270 000204 ; MEMORY OPERATIONS
271 000204
272 000204 ;C @ a-addr -- x fetch cell from
memory
273 000204 HEADER FETCH,1,'@',DOCODE
273.1 000000 PUBLIC FETCH
273.2 000204 .... DW link
273.3 000206 FF DB 0FFh ; not immediate
273.4 000207 link SET $
273.5 000207 01 DB 1
273.6 000208 40 DB '@'
273.7 000209 00 EVEN
273.8 00020A IF 'DOCODE'='DOCODE'
273.9 00020A .... FETCH: DW $+2
273.10 00020C ELSE
273.11 00020C FETCH: DW DOCODE
273.12 00020C ENDIF
273.13 00020C ENDM
274 00020C 2747 MOV @TOS,TOS
275 00020E NEXT
275.1 00020E 3645 MOV @IP+,W // ; fetch word address
into W
275.2 000210 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
275.3 000212 ENDM
276 000212
277 000212 ;C ! x a-addr -- store cell in
memory
278 000212 HEADER STORE,1,'!',DOCODE
278.1 000000 PUBLIC STORE
278.2 000212 .... DW link
278.3 000214 FF DB 0FFh ; not immediate
278.4 000215 link SET $
278.5 000215 01 DB 1
278.6 000216 21 DB '!'
278.7 000217 00 EVEN
278.8 000218 IF 'DOCODE'='DOCODE'
278.9 000218 .... STORE: DW $+2
278.10 00021A ELSE
278.11 00021A STORE: DW DOCODE
278.12 00021A ENDIF
278.13 00021A ENDM
279 00021A B7440000 MOV @PSP+,0(TOS)
280 00021E 3744 MOV @PSP+,TOS
281 000220 NEXT
281.1 000220 3645 MOV @IP+,W // ; fetch word address
into W
281.2 000222 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
281.3 000224 ENDM
282 000224
283 000224 ;C C@ c-addr -- char fetch char from
memory
284 000224 HEADER CFETCH,2,'C@',DOCODE
284.1 000000 PUBLIC CFETCH
284.2 000224 .... DW link
284.3 000226 FF DB 0FFh ; not immediate
284.4 000227 link SET $
284.5 000227 02 DB 2
284.6 000228 4340 DB 'C@'
284.7 00022A EVEN
284.8 00022A IF 'DOCODE'='DOCODE'
284.9 00022A .... CFETCH: DW $+2
284.10 00022C ELSE
284.11 00022C CFETCH: DW DOCODE
284.12 00022C ENDIF
284.13 00022C ENDM
285 00022C 6747 MOV.B @TOS,TOS
286 00022E NEXT
286.1 00022E 3645 MOV @IP+,W // ; fetch word address
into W
286.2 000230 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
286.3 000232 ENDM
287 000232
288 000232 ;C C! char c-addr -- store char in
memory
289 000232 HEADER CSTORE,2,'C!',DOCODE
289.1 000000 PUBLIC CSTORE
289.2 000232 .... DW link
289.3 000234 FF DB 0FFh ; not immediate
289.4 000235 link SET $
289.5 000235 02 DB 2
289.6 000236 4321 DB 'C!'
289.7 000238 EVEN
289.8 000238 IF 'DOCODE'='DOCODE'
289.9 000238 .... CSTORE: DW $+2
289.10 00023A ELSE
289.11 00023A CSTORE: DW DOCODE
289.12 00023A ENDIF
289.13 00023A ENDM
290 00023A 3644 MOV @PSP+,W
291 00023C C7460000 MOV.B W,0(TOS)
292 000240 3744 MOV @PSP+,TOS
293 000242 NEXT
293.1 000242 3645 MOV @IP+,W // ; fetch word address
into W
293.2 000244 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
293.3 000246 ENDM
294 000246
295 000246 ; FLASH MEMORY OPERATIONS
296 000246 ; Note that an I! or IC! to a RAM address
>FLASHSTART will work -- it
297 000246 ; will enable the flash, write the RAM, and then
disable the flash.
298 000246 ; An FLERASE to a RAM address will merely clear
that one RAM cell.
299 000246
300 000246 ;Z FLERASE a-addr n --
301 000246 HEADER FLERASE,7,'FLERASE',DOCODE
301.1 000000 PUBLIC FLERASE
301.2 000246 .... DW link
301.3 000248 FF DB 0FFh ; not immediate
301.4 000249 link SET $
301.5 000249 07 DB 7
301.6 00024A 464C45524153* DB 'FLERASE'
301.7 000251 00 EVEN
301.8 000252 IF 'DOCODE'='DOCODE'
301.9 000252 .... FLERASE: DW $+2
301.10 000254 ELSE
301.11 000254 FLERASE: DW DOCODE
301.12 000254 ENDIF
301.13 000254 ENDM
302 000254 3644 MOV @PSP+,W ; get address in
W
303 000256 0756 ADD W,TOS ; TOS=end adrs
(first unerased
adrs)
304 000258 FLE_1:
305 000258 0697 CMP TOS,W ; adr-end
306 00025A 272C JC FLE_X ; if no borrow,
adr>=end, do
not erase
307 00025C ; is it within Main flash?
308 00025C 369000C0 CMP #FLASHSTART,W ; flash
start
309 000260 0328 JNC FLE_INFO ; if borrow,
adrend, check
if Info
312 000268 FLE_INFO: ; is it within Info flash?
313 000268 36900010 CMP #INFOSTART,W
314 00026C 1E28 JNC FLE_X ; if borrow,
adrend, do not
erase
317 000274 FLE_OK: ; Address is either in Main flash, or in
Info flash.
318 000274 ; Segment Erase from flash.
319 000274 ; Assumes ACCVIE = NMIIE = OFIE = 0,
watchdog disabled.
320 000274 ; Per section 5.3.2 of MSP430 Family
User's Guide
321 000274 32C2 DINT ; Disable
interrupts
322 000276 B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear
LOCK
323 00027C B24002A52801 MOV #FWKEY+ERASE,&FCTL1 ; Enable segment
erase
324 000282 B6430000 MOV #-1,0(W) ; Dummy write in
segment to
erase
325 000286 B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear
erase
command.
326 00028C B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Done, set
LOCK
327 000292 32D2 EINT ; Enable
interrupts
328 000294 ; Advance flash pointer by 512 bytes or
128 bytes
329 000294 ; is it within Main flash?
330 000294 369000C0 CMP #FLASHSTART,W
331 000298 0528 JNC FL_INFO ; if borrow,
adrend, must
be Info
334 0002A0 36508001 ADD #(MAINSEG-INFOSEG),W
335 0002A4 36508000 FL_INFO: ADD #INFOSEG,W
336 0002A8 D73F JMP FLE_1 ; continue till
past end or
outside
limits
337 0002AA 3744 FLE_X: MOV @PSP+,TOS
338 0002AC NEXT
338.1 0002AC 3645 MOV @IP+,W // ; fetch word address
into W
338.2 0002AE 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
338.3 0002B0 ENDM
339 0002B0
340 0002B0 ; Program Space (Flash) operators
341 0002B0
342 0002B0 ;Z I! x a-addr -- store cell in
Instruction memory
343 0002B0 HEADER ISTORE,2,'I!',DOCODE
343.1 000000 PUBLIC ISTORE
343.2 0002B0 .... DW link
343.3 0002B2 FF DB 0FFh ; not immediate
343.4 0002B3 link SET $
343.5 0002B3 02 DB 2
343.6 0002B4 4921 DB 'I!'
343.7 0002B6 EVEN
343.8 0002B6 IF 'DOCODE'='DOCODE'
343.9 0002B6 .... ISTORE: DW $+2
343.10 0002B8 ELSE
343.11 0002B8 ISTORE: DW DOCODE
343.12 0002B8 ENDIF
343.13 0002B8 ENDM
344 0002B8 3644 MOV @PSP+,W ; get data to
write
345 0002BA 17B3 BIT #1,TOS
346 0002BC 1E20 JNZ IST_X ; if not even
address, do not
write
347 0002BE 2697 CMP @TOS,W
348 0002C0 1C24 JZ IST_X ; if memory is
desired value,
do not
write
349 0002C2 ; is it within Main flash?
350 0002C2 379000C0 CMP #FLASHSTART,TOS
351 0002C6 0328 JNC IST_INFO ; if borrow,
adrend, check
if Info
354 0002CE IST_INFO: ; is it within Info flash?
355 0002CE 37900010 CMP #INFOSTART,TOS
356 0002D2 0A28 JNC IST_RAM ; if borrow,
adrend, assume
it's RAM
359 0002DA IST_OK: ; Address is either in Main flash, or in
Info flash.
360 0002DA ; Byte/word write from flash.
361 0002DA ; Assumes location to write is already
erased
362 0002DA ; Assumes ACCVIE = NMIIE = OFIE = 0,
watchdog disabled.
363 0002DA ; Per section 5.3.3 of MSP430 Family
User's Guide
364 0002DA 32C2 DINT ; Disable
interrupts
365 0002DC B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear
LOCK
366 0002E2 B24040A52801 MOV #FWKEY+WRT,&FCTL1 ; Enable
write
367 0002E8 IST_RAM: ; If RAM, jump here to write.
FCTL1,FCTL3,EINT are superfluous
368 0002E8 87460000 MOV W,0(TOS) ; Write word to
flash
location
369 0002EC B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear
WRT.
370 0002F2 B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Set LOCK
371 0002F8 32D2 EINT ; Enable
interrupts
372 0002FA 3744 IST_X: MOV @PSP+,TOS ; pop new
TOS
373 0002FC NEXT
373.1 0002FC 3645 MOV @IP+,W // ; fetch word address
into W
373.2 0002FE 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
373.3 000300 ENDM
374 000300
375 000300 ;Z IC! x a-addr -- store char in
Instruction memory
376 000300 HEADER ICSTORE,3,'IC!',DOCODE
376.1 000000 PUBLIC ICSTORE
376.2 000300 .... DW link
376.3 000302 FF DB 0FFh ; not immediate
376.4 000303 link SET $
376.5 000303 03 DB 3
376.6 000304 494321 DB 'IC!'
376.7 000307 00 EVEN
376.8 000308 IF 'DOCODE'='DOCODE'
376.9 000308 .... ICSTORE: DW $+2
376.10 00030A ELSE
376.11 00030A ICSTORE: DW DOCODE
376.12 00030A ENDIF
376.13 00030A ENDM
377 00030A 3644 MOV @PSP+,W ; get data to
write
378 00030C 6697 CMP.B @TOS,W
379 00030E F527 JZ IST_X ; if memory is
desired value,
do not
write
380 000310 ; is it within Main flash?
381 000310 379000C0 CMP #FLASHSTART,TOS
382 000314 0328 JNC ICST_INFO ; if borrow,
adrend, check
if Info
385 00031C ICST_INFO: ; is it within Info flash?
386 00031C 37900010 CMP #INFOSTART,TOS
387 000320 0A28 JNC ICST_RAM ; if borrow,
adrend, assume
it's RAM
390 000328 ICST_OK: ; Address is either in Main flash, or
in Info flash.
391 000328 ; Byte/word write from flash.
392 000328 ; Assumes location to write is already
erased
393 000328 ; Assumes ACCVIE = NMIIE = OFIE = 0,
watchdog disabled.
394 000328 ; Per section 5.3.3 of MSP430 Family
User's Guide
395 000328 32C2 DINT ; Disable
interrupts
396 00032A B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear
LOCK
397 000330 B24040A52801 MOV #FWKEY+WRT,&FCTL1 ; Enable
write
398 000336 ICST_RAM: ; If RAM, jump here to write.
FCTL1,FCTL3,EINT are superfluous
399 000336 C7460000 MOV.B W,0(TOS) ; Write byte to
flash
location
400 00033A B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear
WRT.
401 000340 B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Set LOCK
402 000346 32D2 EINT ; Enable
interrupts
403 000348 D83F JMP IST_X
404 00034A
405 00034A ;Z I@ a-addr -- x fetch cell from
Instruction memory
406 00034A HEADER IFETCH,2,'I@',FETCH+2
406.1 000000 PUBLIC IFETCH
406.2 00034A .... DW link
406.3 00034C FF DB 0FFh ; not immediate
406.4 00034D link SET $
406.5 00034D 02 DB 2
406.6 00034E 4940 DB 'I@'
406.7 000350 EVEN
406.8 000350 IF 'FETCH+2'='DOCODE'
406.9 000350 IFETCH: DW $+2
406.10 000350 ELSE
406.11 000350 .... IFETCH: DW FETCH+2
406.12 000352 ENDIF
406.13 000352 ENDM
407 000352
408 000352 ;Z IC@ a-addr -- x fetch char from
Instruction memory
409 000352 HEADER ICFETCH,3,'IC@',CFETCH+2
409.1 000000 PUBLIC ICFETCH
409.2 000352 .... DW link
409.3 000354 FF DB 0FFh ; not immediate
409.4 000355 link SET $
409.5 000355 03 DB 3
409.6 000356 494340 DB 'IC@'
409.7 000359 00 EVEN
409.8 00035A IF 'CFETCH+2'='DOCODE'
409.9 00035A ICFETCH: DW $+2
409.10 00035A ELSE
409.11 00035A .... ICFETCH: DW CFETCH+2
409.12 00035C ENDIF
409.13 00035C ENDM
410 00035C
411 00035C ;Z D->I c-addr1 c-addr2 u -- move
Data->Code
412 00035C ; Block move from Data space to Code space.
Flashable.
413 00035C ; For the MSP430, this uses a "smart" algorithm
that uses word writes,
414 00035C ; rather than byte writes, whenever possible.
Note that byte reads
415 00035C ; are used for the source, so it need not be
aligned.
416 00035C HEADER DTOI,4,'D->I',DOCODE
416.1 000000 PUBLIC DTOI
416.2 00035C .... DW link
416.3 00035E FF DB 0FFh ; not immediate
416.4 00035F link SET $
416.5 00035F 04 DB 4
416.6 000360 442D3E49 DB 'D->I'
416.7 000364 EVEN
416.8 000364 IF 'DOCODE'='DOCODE'
416.9 000364 .... DTOI: DW $+2
416.10 000366 ELSE
416.11 000366 DTOI: DW DOCODE
416.12 000366 ENDIF
416.13 000366 ENDM
417 000366 3644 MOV @PSP+,W ; dest adrs
418 000368 3A44 MOV @PSP+,X ; src adrs
419 00036A 0793 CMP #0,TOS
420 00036C 2024 JZ DTOI_X
421 00036E DTOI_LOOP: ; Begin flash write sequence
422 00036E 32C2 DINT ; Disable
interrupts
423 000370 B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear
LOCK
424 000376 B24040A52801 MOV #FWKEY+WRT,&FCTL1 ; Enable
write
425 00037C ; If length is 1, or dest. address is
odd, do a byte write.
426 00037C ; Else, do a word write.
427 00037C 1793 CMP #1,TOS
428 00037E 0B24 JZ DTOI_BYTE
429 000380 16B3 BIT #1,W
430 000382 0920 JNZ DTOI_BYTE
431 000384 7B4A DTOI_WORD: MOV.B @X+,Y ; get low byte
of word
432 000386 7C4A MOV.B @X+,Q ; get high byte
of word
433 000388 8C10 SWPB Q
434 00038A 0BDC BIS Q,Y ; merge
bytes
435 00038C 864B0000 MOV.W Y,0(W) ; write byte to
dest
436 000390 2653 ADD #2,W
437 000392 1783 SUB #1,TOS ; another 1 will
be subtracted
below
438 000394 033C JMP DTOI_END
439 000396 F64A0000 DTOI_BYTE: MOV.B @X+,0(W) ; copy byte from
src to
dest
440 00039A 1653 ADD #1,W
441 00039C DTOI_END: ; End flash write sequence
442 00039C B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear
WRT.
443 0003A2 B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Set LOCK
444 0003A8 32D2 EINT ; Enable
interrupts
445 0003AA 1783 SUB #1,TOS
446 0003AC E023 JNZ DTOI_LOOP
447 0003AE 3744 DTOI_X: MOV @PSP+,TOS ; pop new
TOS
448 0003B0 NEXT
448.1 0003B0 3645 MOV @IP+,W // ; fetch word address
into W
448.2 0003B2 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
448.3 0003B4 ENDM
449 0003B4
450 0003B4 ; ----------------------------------------------
------------------------
451 0003B4 ; ARITHMETIC OPERATIONS
452 0003B4
453 0003B4 ;C + n1/u1 n2/u2 -- n3/u3 add
n1+n2
454 0003B4 HEADER PLUS,1,'+',DOCODE
454.1 000000 PUBLIC PLUS
454.2 0003B4 .... DW link
454.3 0003B6 FF DB 0FFh ; not immediate
454.4 0003B7 link SET $
454.5 0003B7 01 DB 1
454.6 0003B8 2B DB '+'
454.7 0003B9 00 EVEN
454.8 0003BA IF 'DOCODE'='DOCODE'
454.9 0003BA .... PLUS: DW $+2
454.10 0003BC ELSE
454.11 0003BC PLUS: DW DOCODE
454.12 0003BC ENDIF
454.13 0003BC ENDM
455 0003BC 3754 ADD @PSP+,TOS
456 0003BE NEXT
456.1 0003BE 3645 MOV @IP+,W // ; fetch word address
into W
456.2 0003C0 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
456.3 0003C2 ENDM
457 0003C2
458 0003C2 ;C +! n/u a-addr -- add cell to
memory
459 0003C2 HEADER PLUSSTORE,2,'+!',DOCODE
459.1 000000 PUBLIC PLUSSTORE
459.2 0003C2 .... DW link
459.3 0003C4 FF DB 0FFh ; not immediate
459.4 0003C5 link SET $
459.5 0003C5 02 DB 2
459.6 0003C6 2B21 DB '+!'
459.7 0003C8 EVEN
459.8 0003C8 IF 'DOCODE'='DOCODE'
459.9 0003C8 .... PLUSSTORE: DW $+2
459.10 0003CA ELSE
459.11 0003CA PLUSSTORE: DW DOCODE
459.12 0003CA ENDIF
459.13 0003CA ENDM
460 0003CA B7540000 ADD @PSP+,0(TOS)
461 0003CE 3744 MOV @PSP+,TOS
462 0003D0 NEXT
462.1 0003D0 3645 MOV @IP+,W // ; fetch word address
into W
462.2 0003D2 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
462.3 0003D4 ENDM
463 0003D4
464 0003D4 ;X M+ d n -- d add single to
double
465 0003D4 HEADER MPLUS,2,'M+',DOCODE
465.1 000000 PUBLIC MPLUS
465.2 0003D4 .... DW link
465.3 0003D6 FF DB 0FFh ; not immediate
465.4 0003D7 link SET $
465.5 0003D7 02 DB 2
465.6 0003D8 4D2B DB 'M+'
465.7 0003DA EVEN
465.8 0003DA IF 'DOCODE'='DOCODE'
465.9 0003DA .... MPLUS: DW $+2
465.10 0003DC ELSE
465.11 0003DC MPLUS: DW DOCODE
465.12 0003DC ENDIF
465.13 0003DC ENDM
466 0003DC 84570200 ADD TOS,2(PSP)
467 0003E0 84630000 ADDC #0,0(PSP)
468 0003E4 3744 MOV @PSP+,TOS
469 0003E6 NEXT
469.1 0003E6 3645 MOV @IP+,W // ; fetch word address
into W
469.2 0003E8 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
469.3 0003EA ENDM
470 0003EA
471 0003EA ;C - n1/u1 n2/u2 -- n3/u3 subtract
n1-n2
472 0003EA HEADER MINUS,1,'-',DOCODE
472.1 000000 PUBLIC MINUS
472.2 0003EA .... DW link
472.3 0003EC FF DB 0FFh ; not immediate
472.4 0003ED link SET $
472.5 0003ED 01 DB 1
472.6 0003EE 2D DB '-'
472.7 0003EF 00 EVEN
472.8 0003F0 IF 'DOCODE'='DOCODE'
472.9 0003F0 .... MINUS: DW $+2
472.10 0003F2 ELSE
472.11 0003F2 MINUS: DW DOCODE
472.12 0003F2 ENDIF
472.13 0003F2 ENDM
473 0003F2 3644 MOV @PSP+,W
474 0003F4 0687 SUB TOS,W
475 0003F6 0746 MOV W,TOS
476 0003F8 NEXT
476.1 0003F8 3645 MOV @IP+,W // ; fetch word address
into W
476.2 0003FA 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
476.3 0003FC ENDM
477 0003FC
478 0003FC ;C AND x1 x2 -- x3 logical
AND
479 0003FC HEADER ANDD,3,'AND',DOCODE
479.1 000000 PUBLIC ANDD
479.2 0003FC .... DW link
479.3 0003FE FF DB 0FFh ; not immediate
479.4 0003FF link SET $
479.5 0003FF 03 DB 3
479.6 000400 414E44 DB 'AND'
479.7 000403 00 EVEN
479.8 000404 IF 'DOCODE'='DOCODE'
479.9 000404 .... ANDD: DW $+2
479.10 000406 ELSE
479.11 000406 ANDD: DW DOCODE
479.12 000406 ENDIF
479.13 000406 ENDM
480 000406 37F4 AND @PSP+,TOS
481 000408 NEXT
481.1 000408 3645 MOV @IP+,W // ; fetch word address
into W
481.2 00040A 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
481.3 00040C ENDM
482 00040C
483 00040C ;C OR x1 x2 -- x3 logical
OR
484 00040C HEADER ORR,2,'OR',DOCODE
484.1 000000 PUBLIC ORR
484.2 00040C .... DW link
484.3 00040E FF DB 0FFh ; not immediate
484.4 00040F link SET $
484.5 00040F 02 DB 2
484.6 000410 4F52 DB 'OR'
484.7 000412 EVEN
484.8 000412 IF 'DOCODE'='DOCODE'
484.9 000412 .... ORR: DW $+2
484.10 000414 ELSE
484.11 000414 ORR: DW DOCODE
484.12 000414 ENDIF
484.13 000414 ENDM
485 000414 37D4 BIS @PSP+,TOS
486 000416 NEXT
486.1 000416 3645 MOV @IP+,W // ; fetch word address
into W
486.2 000418 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
486.3 00041A ENDM
487 00041A
488 00041A ;C XOR x1 x2 -- x3 logical
XOR
489 00041A HEADER XORR,3,'XOR',DOCODE
489.1 000000 PUBLIC XORR
489.2 00041A .... DW link
489.3 00041C FF DB 0FFh ; not immediate
489.4 00041D link SET $
489.5 00041D 03 DB 3
489.6 00041E 584F52 DB 'XOR'
489.7 000421 00 EVEN
489.8 000422 IF 'DOCODE'='DOCODE'
489.9 000422 .... XORR: DW $+2
489.10 000424 ELSE
489.11 000424 XORR: DW DOCODE
489.12 000424 ENDIF
489.13 000424 ENDM
490 000424 37E4 XOR @PSP+,TOS
491 000426 NEXT
491.1 000426 3645 MOV @IP+,W // ; fetch word address
into W
491.2 000428 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
491.3 00042A ENDM
492 00042A
493 00042A ;C INVERT x1 -- x2 bitwise
inversion
494 00042A HEADER INVERT,6,'INVERT',DOCODE
494.1 000000 PUBLIC INVERT
494.2 00042A .... DW link
494.3 00042C FF DB 0FFh ; not immediate
494.4 00042D link SET $
494.5 00042D 06 DB 6
494.6 00042E 494E56455254 DB 'INVERT'
494.7 000434 EVEN
494.8 000434 IF 'DOCODE'='DOCODE'
494.9 000434 .... INVERT: DW $+2
494.10 000436 ELSE
494.11 000436 INVERT: DW DOCODE
494.12 000436 ENDIF
494.13 000436 ENDM
495 000436 37E3 XOR #-1,TOS
496 000438 NEXT
496.1 000438 3645 MOV @IP+,W // ; fetch word address
into W
496.2 00043A 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
496.3 00043C ENDM
497 00043C
498 00043C ;C NEGATE x1 -- x2 two's complement
499 00043C HEADER NEGATE,6,'NEGATE',DOCODE
499.1 000000 PUBLIC NEGATE
499.2 00043C .... DW link
499.3 00043E FF DB 0FFh ; not immediate
499.4 00043F link SET $
499.5 00043F 06 DB 6
499.6 000440 4E4547415445 DB 'NEGATE'
499.7 000446 EVEN
499.8 000446 IF 'DOCODE'='DOCODE'
499.9 000446 .... NEGATE: DW $+2
499.10 000448 ELSE
499.11 000448 NEGATE: DW DOCODE
499.12 000448 ENDIF
499.13 000448 ENDM
500 000448 37E3 XOR #-1,TOS
501 00044A 1753 ADD #1,TOS
502 00044C NEXT
502.1 00044C 3645 MOV @IP+,W // ; fetch word address
into W
502.2 00044E 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
502.3 000450 ENDM
503 000450
504 000450 ;C 1+ n1/u1 -- n2/u2 add 1 to
TOS
505 000450 HEADER ONEPLUS,2,'1+',DOCODE
505.1 000000 PUBLIC ONEPLUS
505.2 000450 .... DW link
505.3 000452 FF DB 0FFh ; not immediate
505.4 000453 link SET $
505.5 000453 02 DB 2
505.6 000454 312B DB '1+'
505.7 000456 EVEN
505.8 000456 IF 'DOCODE'='DOCODE'
505.9 000456 .... ONEPLUS: DW $+2
505.10 000458 ELSE
505.11 000458 ONEPLUS: DW DOCODE
505.12 000458 ENDIF
505.13 000458 ENDM
506 000458 1753 ADD #1,TOS
507 00045A NEXT
507.1 00045A 3645 MOV @IP+,W // ; fetch word address
into W
507.2 00045C 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
507.3 00045E ENDM
508 00045E
509 00045E ;C 1- n1/u1 -- n2/u2 subtract 1 from
TOS
510 00045E HEADER ONEMINUS,2,'1-',DOCODE
510.1 000000 PUBLIC ONEMINUS
510.2 00045E .... DW link
510.3 000460 FF DB 0FFh ; not immediate
510.4 000461 link SET $
510.5 000461 02 DB 2
510.6 000462 312D DB '1-'
510.7 000464 EVEN
510.8 000464 IF 'DOCODE'='DOCODE'
510.9 000464 .... ONEMINUS: DW $+2
510.10 000466 ELSE
510.11 000466 ONEMINUS: DW DOCODE
510.12 000466 ENDIF
510.13 000466 ENDM
511 000466 1783 SUB #1,TOS
512 000468 NEXT
512.1 000468 3645 MOV @IP+,W // ; fetch word address
into W
512.2 00046A 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
512.3 00046C ENDM
513 00046C
514 00046C ;Z >< x1 -- x2 swap bytes (not
ANSI)
515 00046C HEADER SWAPBYTES,2,'><',DOCODE
515.1 000000 PUBLIC SWAPBYTES
515.2 00046C .... DW link
515.3 00046E FF DB 0FFh ; not immediate
515.4 00046F link SET $
515.5 00046F 02 DB 2
515.6 000470 3E3C DB '><'
515.7 000472 EVEN
515.8 000472 IF 'DOCODE'='DOCODE'
515.9 000472 .... SWAPBYTES: DW $+2
515.10 000474 ELSE
515.11 000474 SWAPBYTES: DW DOCODE
515.12 000474 ENDIF
515.13 000474 ENDM
516 000474 8710 SWPB TOS
517 000476 NEXT
517.1 000476 3645 MOV @IP+,W // ; fetch word address
into W
517.2 000478 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
517.3 00047A ENDM
518 00047A
519 00047A ;C 2* x1 -- x2 arithmetic left
shift
520 00047A HEADER TWOSTAR,2,'2*',DOCODE
520.1 000000 PUBLIC TWOSTAR
520.2 00047A .... DW link
520.3 00047C FF DB 0FFh ; not immediate
520.4 00047D link SET $
520.5 00047D 02 DB 2
520.6 00047E 322A DB '2*'
520.7 000480 EVEN
520.8 000480 IF 'DOCODE'='DOCODE'
520.9 000480 .... TWOSTAR: DW $+2
520.10 000482 ELSE
520.11 000482 TWOSTAR: DW DOCODE
520.12 000482 ENDIF
520.13 000482 ENDM
521 000482 0757 ADD TOS,TOS
522 000484 NEXT
522.1 000484 3645 MOV @IP+,W // ; fetch word address
into W
522.2 000486 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
522.3 000488 ENDM
523 000488
524 000488 ;C 2/ x1 -- x2 arithmetic right
shift
525 000488 HEADER TWOSLASH,2,'2/',DOCODE
525.1 000000 PUBLIC TWOSLASH
525.2 000488 .... DW link
525.3 00048A FF DB 0FFh ; not immediate
525.4 00048B link SET $
525.5 00048B 02 DB 2
525.6 00048C 322F DB '2/'
525.7 00048E EVEN
525.8 00048E IF 'DOCODE'='DOCODE'
525.9 00048E .... TWOSLASH: DW $+2
525.10 000490 ELSE
525.11 000490 TWOSLASH: DW DOCODE
525.12 000490 ENDIF
525.13 000490 ENDM
526 000490 0711 RRA TOS
527 000492 NEXT
527.1 000492 3645 MOV @IP+,W // ; fetch word address
into W
527.2 000494 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
527.3 000496 ENDM
528 000496
529 000496 ;C LSHIFT x1 u -- x2 logical L shift u
places
530 000496 HEADER LSHIFT,6,'LSHIFT',DOCODE
530.1 000000 PUBLIC LSHIFT
530.2 000496 .... DW link
530.3 000498 FF DB 0FFh ; not immediate
530.4 000499 link SET $
530.5 000499 06 DB 6
530.6 00049A 4C5348494654 DB 'LSHIFT'
530.7 0004A0 EVEN
530.8 0004A0 IF 'DOCODE'='DOCODE'
530.9 0004A0 .... LSHIFT: DW $+2
530.10 0004A2 ELSE
530.11 0004A2 LSHIFT: DW DOCODE
530.12 0004A2 ENDIF
530.13 0004A2 ENDM
531 0004A2 3644 MOV @PSP+,W
532 0004A4 37F01F00 AND #1Fh,TOS ; no need to
shift more than
16
533 0004A8 0324 JZ LSH_X
534 0004AA 0656 LSH_1: ADD W,W
535 0004AC 1783 SUB #1,TOS
536 0004AE FD23 JNZ LSH_1
537 0004B0 0746 LSH_X: MOV W,TOS
538 0004B2 NEXT
538.1 0004B2 3645 MOV @IP+,W // ; fetch word address
into W
538.2 0004B4 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
538.3 0004B6 ENDM
539 0004B6
540 0004B6 ;C RSHIFT x1 u -- x2 logical R shift u
places
541 0004B6 HEADER RSHIFT,6,'RSHIFT',DOCODE
541.1 000000 PUBLIC RSHIFT
541.2 0004B6 .... DW link
541.3 0004B8 FF DB 0FFh ; not immediate
541.4 0004B9 link SET $
541.5 0004B9 06 DB 6
541.6 0004BA 525348494654 DB 'RSHIFT'
541.7 0004C0 EVEN
541.8 0004C0 IF 'DOCODE'='DOCODE'
541.9 0004C0 .... RSHIFT: DW $+2
541.10 0004C2 ELSE
541.11 0004C2 RSHIFT: DW DOCODE
541.12 0004C2 ENDIF
541.13 0004C2 ENDM
542 0004C2 3644 MOV @PSP+,W
543 0004C4 37F01F00 AND #1Fh,TOS ; no need to
shift more than
16
544 0004C8 0424 JZ RSH_X
545 0004CA 12C3 RSH_1: CLRC
546 0004CC 0610 RRC W
547 0004CE 1783 SUB #1,TOS
548 0004D0 FC23 JNZ RSH_1
549 0004D2 0746 RSH_X: MOV W,TOS
550 0004D4 NEXT
550.1 0004D4 3645 MOV @IP+,W // ; fetch word address
into W
550.2 0004D6 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
550.3 0004D8 ENDM
551 0004D8
552 0004D8 ; ----------------------------------------------
------------------------
553 0004D8 ; COMPARISON OPERATIONS
554 0004D8
555 0004D8 ;C 0= n/u -- flag return true if
TOS=0
556 0004D8 HEADER ZEROEQUAL,2,'0=',DOCODE
556.1 000000 PUBLIC ZEROEQUAL
556.2 0004D8 .... DW link
556.3 0004DA FF DB 0FFh ; not immediate
556.4 0004DB link SET $
556.5 0004DB 02 DB 2
556.6 0004DC 303D DB '0='
556.7 0004DE EVEN
556.8 0004DE IF 'DOCODE'='DOCODE'
556.9 0004DE .... ZEROEQUAL: DW $+2
556.10 0004E0 ELSE
556.11 0004E0 ZEROEQUAL: DW DOCODE
556.12 0004E0 ENDIF
556.13 0004E0 ENDM
557 0004E0 1783 SUB #1,TOS ; borrow (clear cy)
if TOS was
0
558 0004E2 0777 SUBC TOS,TOS ; TOS=-1 if borrow
was set
559 0004E4 NEXT
559.1 0004E4 3645 MOV @IP+,W // ; fetch word address
into W
559.2 0004E6 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
559.3 0004E8 ENDM
560 0004E8
561 0004E8 ;C 0< n -- flag true if TOS negative
562 0004E8 HEADER ZEROLESS,2,'0<',DOCODE
562.1 000000 PUBLIC ZEROLESS
562.2 0004E8 .... DW link
562.3 0004EA FF DB 0FFh ; not immediate
562.4 0004EB link SET $
562.5 0004EB 02 DB 2
562.6 0004EC 303C DB '0<'
562.7 0004EE EVEN
562.8 0004EE IF 'DOCODE'='DOCODE'
562.9 0004EE .... ZEROLESS: DW $+2
562.10 0004F0 ELSE
562.11 0004F0 ZEROLESS: DW DOCODE
562.12 0004F0 ENDIF
562.13 0004F0 ENDM
563 0004F0 0757 ADD TOS,TOS ; set cy if TOS
negative
564 0004F2 0777 SUBC TOS,TOS ; TOS=-1 if carry
was clear
565 0004F4 37E3 XOR #-1,TOS ; TOS=-1 if carry
was set
566 0004F6 NEXT
566.1 0004F6 3645 MOV @IP+,W // ; fetch word address
into W
566.2 0004F8 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
566.3 0004FA ENDM
567 0004FA
568 0004FA ;C = x1 x2 -- flag test x1=x2
569 0004FA HEADER EQUAL,1,'=',DOCODE
569.1 000000 PUBLIC EQUAL
569.2 0004FA .... DW link
569.3 0004FC FF DB 0FFh ; not immediate
569.4 0004FD link SET $
569.5 0004FD 01 DB 1
569.6 0004FE 3D DB '='
569.7 0004FF 00 EVEN
569.8 000500 IF 'DOCODE'='DOCODE'
569.9 000500 .... EQUAL: DW $+2
569.10 000502 ELSE
569.11 000502 EQUAL: DW DOCODE
569.12 000502 ENDIF
569.13 000502 ENDM
570 000502 3644 MOV @PSP+,W
571 000504 0687 SUB TOS,W ; x1-x2 in W, flags
set
572 000506 1124 JZ TOSTRUE
573 000508 0743 TOSFALSE: MOV #0,TOS
574 00050A NEXT
574.1 00050A 3645 MOV @IP+,W // ; fetch word address
into W
574.2 00050C 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
574.3 00050E ENDM
575 00050E
576 00050E ;X <> x1 x2 -- flag test not eq (not
ANSI)
577 00050E HEADER NOTEQUAL,2,'<>',DOCOLON
577.1 000000 PUBLIC NOTEQUAL
577.2 00050E .... DW link
577.3 000510 FF DB 0FFh ; not immediate
577.4 000511 link SET $
577.5 000511 02 DB 2
577.6 000512 3C3E DB '<>'
577.7 000514 EVEN
577.8 000514 IF 'DOCOLON'='DOCODE'
577.9 000514 NOTEQUAL: DW $+2
577.10 000514 ELSE
577.11 000514 .... NOTEQUAL: DW DOCOLON
577.12 000516 ENDIF
577.13 000516 ENDM
578 000516 ............ DW EQUAL,ZEROEQUAL,EXIT
579 00051C
580 00051C ;C < n1 n2 -- flag test n1 n1 n2 -- flag test n1>n2,
signed
589 000530 HEADER GREATER,1,'>',DOCOLON
589.1 000000 PUBLIC GREATER
589.2 000530 .... DW link
589.3 000532 FF DB 0FFh ; not immediate
589.4 000533 link SET $
589.5 000533 01 DB 1
589.6 000534 3E DB '>'
589.7 000535 00 EVEN
589.8 000536 IF 'DOCOLON'='DOCODE'
589.9 000536 GREATER: DW $+2
589.10 000536 ELSE
589.11 000536 .... GREATER: DW DOCOLON
589.12 000538 ENDIF
589.13 000538 ENDM
590 000538 ............ DW SWAP,LESS,EXIT
591 00053E
592 00053E ;C U< u1 u2 -- flag test u1 u1 u2 -- flag u1>u2 unsgd (not
ANSI)
600 00054E HEADER UGREATER,2,'U>',DOCOLON
600.1 000000 PUBLIC UGREATER
600.2 00054E .... DW link
600.3 000550 FF DB 0FFh ; not immediate
600.4 000551 link SET $
600.5 000551 02 DB 2
600.6 000552 553E DB 'U>'
600.7 000554 EVEN
600.8 000554 IF 'DOCOLON'='DOCODE'
600.9 000554 UGREATER: DW $+2
600.10 000554 ELSE
600.11 000554 .... UGREATER: DW DOCOLON
600.12 000556 ENDIF
600.13 000556 ENDM
601 000556 ............ DW SWAP,ULESS,EXIT
602 00055C
603 00055C ; ----------------------------------------------
------------------------
604 00055C ; LOOP AND BRANCH OPERATIONS
605 00055C ; These use relative branch addresses: a branch
is ADD @IP,IP
606 00055C
607 00055C ;Z branch -- branch
always
608 00055C HEADER bran,6,'branch',DOCODE
608.1 000000 PUBLIC bran
608.2 00055C .... DW link
608.3 00055E FF DB 0FFh ; not immediate
608.4 00055F link SET $
608.5 00055F 06 DB 6
608.6 000560 6272616E6368 DB 'branch'
608.7 000566 EVEN
608.8 000566 IF 'DOCODE'='DOCODE'
608.9 000566 .... bran: DW $+2
608.10 000568 ELSE
608.11 000568 bran: DW DOCODE
608.12 000568 ENDIF
608.13 000568 ENDM
609 000568 2555 dobran: ADD @IP,IP ; 2
610 00056A NEXT ; 4
610.1 00056A 3645 MOV @IP+,W // ; fetch word address
into W
610.2 00056C 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
610.3 00056E ENDM
611 00056E
612 00056E ;Z ?branch x -- branch if TOS
zero
613 00056E HEADER qbran,7,'?branch',DOCODE
613.1 000000 PUBLIC qbran
613.2 00056E .... DW link
613.3 000570 FF DB 0FFh ; not immediate
613.4 000571 link SET $
613.5 000571 07 DB 7
613.6 000572 3F6272616E63* DB '?branch'
613.7 000579 00 EVEN
613.8 00057A IF 'DOCODE'='DOCODE'
613.9 00057A .... qbran: DW $+2
613.10 00057C ELSE
613.11 00057C qbran: DW DOCODE
613.12 00057C ENDIF
613.13 00057C ENDM
614 00057C 0753 ADD #0,TOS ; 1 test TOS value
615 00057E 3744 MOV @PSP+,TOS ; 2 pop new TOS value
(doesn't change
flags)
616 000580 F327 JZ dobran ; 2 if TOS was zero, take
the branch
617 000582 2553 ADD #2,IP ; 1 else skip the
branch destination
618 000584 NEXT ; 4
618.1 000584 3645 MOV @IP+,W // ; fetch word address
into W
618.2 000586 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
618.3 000588 ENDM
619 000588
620 000588 ;Z (do) n1|u1 n2|u2 -- R: -- sys1 sys2
621 000588 ;Z run-time code for
DO
622 000588 ; '83 and ANSI standard loops terminate when the
boundary of
623 000588 ; limit-1 and limit is crossed, in either
direction. This can
624 000588 ; be conveniently implemented by making the
limit 8000h, so that
625 000588 ; arithmetic overflow logic can detect crossing.
I learned this
626 000588 ; trick from Laxen & Perry F83.
627 000588 ; fudge factor = 8000h-limit, to be added to the
start value.
628 000588 HEADER xdo,4,'(do)',DOCODE
628.1 000000 PUBLIC xdo
628.2 000588 .... DW link
628.3 00058A FF DB 0FFh ; not immediate
628.4 00058B link SET $
628.5 00058B 04 DB 4
628.6 00058C 28646F29 DB '(do)'
628.7 000590 EVEN
628.8 000590 IF 'DOCODE'='DOCODE'
628.9 000590 .... xdo: DW $+2
628.10 000592 ELSE
628.11 000592 xdo: DW DOCODE
628.12 000592 ENDIF
628.13 000592 ENDM
629 000592 2182 SUB #4,RSP ; push old loop
values on
return
stack
630 000594 81490200 MOV LIMIT,2(RSP)
631 000598 81480000 MOV INDEX,0(RSP)
632 00059C 39400080 MOV #8000h,LIMIT ; compute
8000h-limit
"fudge
factor"
633 0005A0 3984 SUB @PSP+,LIMIT
634 0005A2 0847 MOV TOS,INDEX ; loop ctr =
index+fudge
635 0005A4 0859 ADD LIMIT,INDEX
636 0005A6 3744 MOV @PSP+,TOS ; pop new
TOS
637 0005A8 NEXT
637.1 0005A8 3645 MOV @IP+,W // ; fetch word address
into W
637.2 0005AA 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
637.3 0005AC ENDM
638 0005AC
639 0005AC ;Z (loop) R: sys1 sys2 -- | sys1 sys2
640 0005AC ;Z run-time code for
LOOP
641 0005AC ; Add 1 to the loop index. If loop terminates,
clean up the
642 0005AC ; return stack and skip the branch. Else take
the inline branch.
643 0005AC ; Note that LOOP terminates when index=8000h.
644 0005AC HEADER xloop,6,'(loop)',DOCODE
644.1 000000 PUBLIC xloop
644.2 0005AC .... DW link
644.3 0005AE FF DB 0FFh ; not immediate
644.4 0005AF link SET $
644.5 0005AF 06 DB 6
644.6 0005B0 286C6F6F7029 DB '(loop)'
644.7 0005B6 EVEN
644.8 0005B6 IF 'DOCODE'='DOCODE'
644.9 0005B6 .... xloop: DW $+2
644.10 0005B8 ELSE
644.11 0005B8 xloop: DW DOCODE
644.12 0005B8 ENDIF
644.13 0005B8 ENDM
645 0005B8 1853 ADD #1,INDEX
646 0005BA 32B00001 BIT #100h,SR ; is overflow bit
set?
647 0005BE D427 JZ dobran ; no overflow =
loop
648 0005C0 2553 ADD #2,IP ; overflow = loop
done, skip branch
ofs
649 0005C2 3841 MOV @RSP+,INDEX ; restore old loop
values
650 0005C4 3941 MOV @RSP+,LIMIT
651 0005C6 NEXT
651.1 0005C6 3645 MOV @IP+,W // ; fetch word address
into W
651.2 0005C8 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
651.3 0005CA ENDM
652 0005CA
653 0005CA ;Z (+loop) n -- R: sys1 sys2 -- | sys1
sys2
654 0005CA ;Z run-time code for
+LOOP
655 0005CA ; Add n to the loop index. If loop terminates,
clean up the
656 0005CA ; return stack and skip the branch. Else take
the inline branch.
657 0005CA HEADER xplusloop,7,'(+loop)',DOCODE
657.1 000000 PUBLIC xplusloop
657.2 0005CA .... DW link
657.3 0005CC FF DB 0FFh ; not immediate
657.4 0005CD link SET $
657.5 0005CD 07 DB 7
657.6 0005CE 282B6C6F6F70* DB '(+loop)'
657.7 0005D5 00 EVEN
657.8 0005D6 IF 'DOCODE'='DOCODE'
657.9 0005D6 .... xplusloop: DW $+2
657.10 0005D8 ELSE
657.11 0005D8 xplusloop: DW DOCODE
657.12 0005D8 ENDIF
657.13 0005D8 ENDM
658 0005D8 0857 ADD TOS,INDEX
659 0005DA 3744 MOV @PSP+,TOS ; get new TOS,
doesn't change
flags
660 0005DC 32B00001 BIT #100h,SR ; is overflow bit
set?
661 0005E0 C327 JZ dobran ; no overflow =
loop
662 0005E2 2553 ADD #2,IP ; overflow = loop
done, skip branch
ofs
663 0005E4 3841 MOV @RSP+,INDEX ; restore old loop
values
664 0005E6 3941 MOV @RSP+,LIMIT
665 0005E8 NEXT
665.1 0005E8 3645 MOV @IP+,W // ; fetch word address
into W
665.2 0005EA 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
665.3 0005EC ENDM
666 0005EC
667 0005EC ;C I -- n R: sys1 sys2 -- sys1
sys2
668 0005EC ;C get the innermost loop
index
669 0005EC HEADER II,1,'I',DOCODE
669.1 000000 PUBLIC II
669.2 0005EC .... DW link
669.3 0005EE FF DB 0FFh ; not immediate
669.4 0005EF link SET $
669.5 0005EF 01 DB 1
669.6 0005F0 49 DB 'I'
669.7 0005F1 00 EVEN
669.8 0005F2 IF 'DOCODE'='DOCODE'
669.9 0005F2 .... II: DW $+2
669.10 0005F4 ELSE
669.11 0005F4 II: DW DOCODE
669.12 0005F4 ENDIF
669.13 0005F4 ENDM
670 0005F4 2483 SUB #2,PSP ; make room in
TOS
671 0005F6 84470000 MOV TOS,0(PSP)
672 0005FA 0748 MOV INDEX,TOS ; index =
loopctr -
fudge
673 0005FC 0789 SUB LIMIT,TOS
674 0005FE NEXT
674.1 0005FE 3645 MOV @IP+,W // ; fetch word address
into W
674.2 000600 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
674.3 000602 ENDM
675 000602
676 000602 ;C J -- n R: 4*sys -- 4*sys
677 000602 ;C get the second loop
index
678 000602 HEADER JJ,1,'J',DOCODE
678.1 000000 PUBLIC JJ
678.2 000602 .... DW link
678.3 000604 FF DB 0FFh ; not immediate
678.4 000605 link SET $
678.5 000605 01 DB 1
678.6 000606 4A DB 'J'
678.7 000607 00 EVEN
678.8 000608 IF 'DOCODE'='DOCODE'
678.9 000608 .... JJ: DW $+2
678.10 00060A ELSE
678.11 00060A JJ: DW DOCODE
678.12 00060A ENDIF
678.13 00060A ENDM
679 00060A 2483 SUB #2,PSP ; make room in
TOS
680 00060C 84470000 MOV TOS,0(PSP)
681 000610 2741 MOV @RSP,TOS ; index =
loopctr -
fudge
682 000612 17810200 SUB 2(RSP),TOS
683 000616 NEXT
683.1 000616 3645 MOV @IP+,W // ; fetch word address
into W
683.2 000618 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
683.3 00061A ENDM
684 00061A
685 00061A ;C UNLOOP -- R: sys1 sys2 -- drop loop
parms
686 00061A HEADER UNLOOP,6,'UNLOOP',DOCODE
686.1 000000 PUBLIC UNLOOP
686.2 00061A .... DW link
686.3 00061C FF DB 0FFh ; not immediate
686.4 00061D link SET $
686.5 00061D 06 DB 6
686.6 00061E 554E4C4F4F50 DB 'UNLOOP'
686.7 000624 EVEN
686.8 000624 IF 'DOCODE'='DOCODE'
686.9 000624 .... UNLOOP: DW $+2
686.10 000626 ELSE
686.11 000626 UNLOOP: DW DOCODE
686.12 000626 ENDIF
686.13 000626 ENDM
687 000626 3841 MOV @RSP+,INDEX ; restore old
loop values
688 000628 3941 MOV @RSP+,LIMIT
689 00062A NEXT
689.1 00062A 3645 MOV @IP+,W // ; fetch word address
into W
689.2 00062C 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
689.3 00062E ENDM
690 00062E
691 00062E ; ----------------------------------------------
------------------------
692 00062E ; MULTIPLY AND DIVIDE
693 00062E
694 00062E ;C UM* u1 u2 -- ud unsigned 16x16->32
mult.
695 00062E HEADER UMSTAR,3,'UM*',DOCODE
695.1 000000 PUBLIC UMSTAR
695.2 00062E .... DW link
695.3 000630 FF DB 0FFh ; not immediate
695.4 000631 link SET $
695.5 000631 03 DB 3
695.6 000632 554D2A DB 'UM*'
695.7 000635 00 EVEN
695.8 000636 IF 'DOCODE'='DOCODE'
695.9 000636 .... UMSTAR: DW $+2
695.10 000638 ELSE
695.11 000638 UMSTAR: DW DOCODE
695.12 000638 ENDIF
695.13 000638 ENDM
696 000638 ; IROP1 = TOS register
697 000638 2A44 MOV @PSP,IROP2L ; get u1, leave
room on
stack
698 00063A ;
699 00063A ; T.I. SIGNED MULTIPLY SUBROUTINE: IROP1 x
IROP2L -> IRACM|IRACL
700 00063A 0C43 MPYU: CLR IRACL ; 0 -> LSBs RESULT
701 00063C 0D43 CLR IRACM ; 0 -> MSBs RESULT
702 00063E ; UNSIGNED MULTIPLY AND ACCUMULATE SUBROUTINE:
703 00063E ; (IROP1 x IROP2L) + IRACM|IRACL -> IRACM|IRACL
704 00063E 0B43 MACU: CLR IROP2M ; MSBs MULTIPLIER
705 000640 1643 MOV #1,IRBT ; BIT TEST REGISTER
706 000642 07B6 L$002: BIT IRBT,IROP1 ; TEST ACTUAL BIT
707 000644 0224 JZ L$01 ; IF 0: DO NOTHING
708 000646 0C5A ADD IROP2L,IRACL ; IF 1: ADD MULTIPLIER
TO RESULT
709 000648 0D6B ADDC IROP2M,IRACM
710 00064A 0A5A L$01: RLA IROP2L ; MULTIPLIER x 2
711 00064C 0B6B RLC IROP2M
712 00064E ;
713 00064E 0656 RLA IRBT ; NEXT BIT TO TEST
714 000650 F82B JNC L$002 ; IF BIT IN CARRY:
FINISHED
715 000652 ; END T.I. ROUTINE section 5.1.1 of MSP430
Family Application Reports
716 000652 844C0000 MOV IRACL,0(PSP) ; low result on
stack
717 000656 074D MOV IRACM,TOS ; high result in
TOS
718 000658 NEXT
718.1 000658 3645 MOV @IP+,W // ; fetch word address
into W
718.2 00065A 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
718.3 00065C ENDM
719 00065C
720 00065C ;C UM/MOD ud u1 -- u2 u3 unsigned 32/16->16
721 00065C HEADER UMSLASHMOD,6,'UM/MOD',DOCODE
721.1 000000 PUBLIC UMSLASHMOD
721.2 00065C .... DW link
721.3 00065E FF DB 0FFh ; not immediate
721.4 00065F link SET $
721.5 00065F 06 DB 6
721.6 000660 554D2F4D4F44 DB 'UM/MOD'
721.7 000666 EVEN
721.8 000666 IF 'DOCODE'='DOCODE'
721.9 000666 .... UMSLASHMOD: DW $+2
721.10 000668 ELSE
721.11 000668 UMSLASHMOD: DW DOCODE
721.12 000668 ENDIF
721.13 000668 ENDM
722 000668 ; IROP1 = TOS register
723 000668 3B44 MOV @PSP+,IROP2M ; get ud
hi
724 00066A 2A44 MOV @PSP,IROP2L ; get ud lo,
leave room on
stack
725 00066C ;
726 00066C ; T.I. UNSIGNED DIVISION SUBROUTINE 32-BIT BY
16-BIT
727 00066C ; IROP2M|IROP2L : IROP1 -> IRACL REMAINDER IN
IROP2M
728 00066C ; RETURN: CARRY = 0: OK CARRY = 1: QUOTIENT > 16
BITS
729 00066C 0C43 DIVIDE: CLR IRACL ; CLEAR RESULT
730 00066E 36401100 MOV #17,IRBT ; INITIALIZE LOOP
COUNTER
731 000672 0B97 DIV1: CMP IROP1,IROP2M ;
732 000674 0128 JLO DIV2
733 000676 0B87 SUB IROP1,IROP2M
734 000678 0C6C DIV2: RLC IRACL
735 00067A 092C JC DIV4 ; Error: result > 16
bits
736 00067C 1683 DEC IRBT ; Decrement loop counter
737 00067E 0624 JZ DIV3 ; Is 0: terminate w/o
error
738 000680 0A5A RLA IROP2L
739 000682 0B6B RLC IROP2M
740 000684 F62B JNC DIV1
741 000686 0B87 SUB IROP1,IROP2M
742 000688 12D3 SETC
743 00068A F63F JMP DIV2
744 00068C 12C3 DIV3: CLRC ; No error, C = 0
745 00068E DIV4: ; Error indication in C
746 00068E ; END T.I. ROUTINE Section 5.1.5 of MSP430
Family Application Reports
747 00068E 844B0000 MOV IROP2M,0(PSP) ; remainder on
stack
748 000692 074C MOV IRACL,TOS ; quotient in
TOS
749 000694 NEXT
749.1 000694 3645 MOV @IP+,W // ; fetch word address
into W
749.2 000696 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
749.3 000698 ENDM
750 000698
751 000698 ; ----------------------------------------------
------------------------
752 000698 ; BLOCK AND STRING OPERATIONS
753 000698
754 000698 ;C FILL c-addr u char -- fill memory with
char
755 000698 HEADER FILL,4,'FILL',DOCODE
755.1 000000 PUBLIC FILL
755.2 000698 .... DW link
755.3 00069A FF DB 0FFh ; not immediate
755.4 00069B link SET $
755.5 00069B 04 DB 4
755.6 00069C 46494C4C DB 'FILL'
755.7 0006A0 EVEN
755.8 0006A0 IF 'DOCODE'='DOCODE'
755.9 0006A0 .... FILL: DW $+2
755.10 0006A2 ELSE
755.11 0006A2 FILL: DW DOCODE
755.12 0006A2 ENDIF
755.13 0006A2 ENDM
756 0006A2 3A44 MOV @PSP+,X ; count
757 0006A4 3644 MOV @PSP+,W ; address
758 0006A6 0A93 CMP #0,X
759 0006A8 0524 JZ FILL_X
760 0006AA C6470000 FILL_1: MOV.B TOS,0(W) ; store char in
memory
761 0006AE 1653 ADD #1,W
762 0006B0 1A83 SUB #1,X
763 0006B2 FB23 JNZ FILL_1
764 0006B4 3744 FILL_X: MOV @PSP+,TOS ; pop new TOS
765 0006B6 NEXT
765.1 0006B6 3645 MOV @IP+,W // ; fetch word address
into W
765.2 0006B8 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
765.3 0006BA ENDM
766 0006BA
767 0006BA ;X CMOVE c-addr1 c-addr2 u -- move from
bottom
768 0006BA ; as defined in the ANSI optional String word
set
769 0006BA ; On byte machines, CMOVE and CMOVE> are
logical
770 0006BA ; factors of MOVE. They are easy to implement
on
771 0006BA ; CPUs which have a block-move instruction.
772 0006BA HEADER CMOVE,5,'CMOVE',DOCODE
772.1 000000 PUBLIC CMOVE
772.2 0006BA .... DW link
772.3 0006BC FF DB 0FFh ; not immediate
772.4 0006BD link SET $
772.5 0006BD 05 DB 5
772.6 0006BE 434D4F5645 DB 'CMOVE'
772.7 0006C3 00 EVEN
772.8 0006C4 IF 'DOCODE'='DOCODE'
772.9 0006C4 .... CMOVE: DW $+2
772.10 0006C6 ELSE
772.11 0006C6 CMOVE: DW DOCODE
772.12 0006C6 ENDIF
772.13 0006C6 ENDM
773 0006C6 3644 MOV @PSP+,W ; dest adrs
774 0006C8 3A44 MOV @PSP+,X ; src adrs
775 0006CA 0793 CMP #0,TOS
776 0006CC 0524 JZ CMOVE_X
777 0006CE F64A0000 CMOVE_1: MOV.B @X+,0(W) ; copy byte
778 0006D2 1653 ADD #1,W
779 0006D4 1783 SUB #1,TOS
780 0006D6 FB23 JNZ CMOVE_1
781 0006D8 3744 CMOVE_X: MOV @PSP+,TOS ; pop new TOS
782 0006DA NEXT
782.1 0006DA 3645 MOV @IP+,W // ; fetch word address
into W
782.2 0006DC 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
782.3 0006DE ENDM
783 0006DE
784 0006DE ;X CMOVE> c-addr1 c-addr2 u -- move from
top
785 0006DE ; as defined in the ANSI optional String word
set
786 0006DE HEADER CMOVEUP,6,'CMOVE>',DOCODE
786.1 000000 PUBLIC CMOVEUP
786.2 0006DE .... DW link
786.3 0006E0 FF DB 0FFh ; not immediate
786.4 0006E1 link SET $
786.5 0006E1 06 DB 6
786.6 0006E2 434D4F56453E DB 'CMOVE>'
786.7 0006E8 EVEN
786.8 0006E8 IF 'DOCODE'='DOCODE'
786.9 0006E8 .... CMOVEUP: DW $+2
786.10 0006EA ELSE
786.11 0006EA CMOVEUP: DW DOCODE
786.12 0006EA ENDIF
786.13 0006EA ENDM
787 0006EA 3644 MOV @PSP+,W ; dest adrs
788 0006EC 3A44 MOV @PSP+,X ; src adrs
789 0006EE 0793 CMP #0,TOS
790 0006F0 0824 JZ CMOVU_X
791 0006F2 0657 ADD TOS,W ; start at
end
792 0006F4 0A57 ADD TOS,X
793 0006F6 1A83 CMOVU_1: SUB #1,X
794 0006F8 1683 SUB #1,W
795 0006FA E64A0000 MOV.B @X,0(W) ; copy byte
796 0006FE 1783 SUB #1,TOS
797 000700 FA23 JNZ CMOVU_1
798 000702 3744 CMOVU_X: MOV @PSP+,TOS ; pop new TOS
799 000704 NEXT
799.1 000704 3645 MOV @IP+,W // ; fetch word address
into W
799.2 000706 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
799.3 000708 ENDM
800 000708
801 000708 ;Z I->D c-addr1 c-addr2 u -- move
Code->Data
802 000708 ; Block move from Code space to Data space.
803 000708 ; On the MSP430, this is the same as CMOVE.
804 000708 HEADER ITOD,4,'I->D',CMOVE+2
804.1 000000 PUBLIC ITOD
804.2 000708 .... DW link
804.3 00070A FF DB 0FFh ; not immediate
804.4 00070B link SET $
804.5 00070B 04 DB 4
804.6 00070C 492D3E44 DB 'I->D'
804.7 000710 EVEN
804.8 000710 IF 'CMOVE+2'='DOCODE'
804.9 000710 ITOD: DW $+2
804.10 000710 ELSE
804.11 000710 .... ITOD: DW CMOVE+2
804.12 000712 ENDIF
804.13 000712 ENDM
805 000712
806 000712 ;Z SKIP c-addr u c -- c-addr' u'
807 000712 ;Z skip matching
chars
808 000712 ; Although SKIP, SCAN, and S= are perhaps not
the ideal factors
809 000712 ; of WORD and FIND, they closely follow the
string operations
810 000712 ; available on many CPUs, and so are easy to
implement and fast.
811 000712 HEADER SKIP,4,'SKIP',DOCODE
811.1 000000 PUBLIC SKIP
811.2 000712 .... DW link
811.3 000714 FF DB 0FFh ; not immediate
811.4 000715 link SET $
811.5 000715 04 DB 4
811.6 000716 534B4950 DB 'SKIP'
811.7 00071A EVEN
811.8 00071A IF 'DOCODE'='DOCODE'
811.9 00071A .... SKIP: DW $+2
811.10 00071C ELSE
811.11 00071C SKIP: DW DOCODE
811.12 00071C ENDIF
811.13 00071C ENDM
812 00071C 3A44 MOV @PSP+,X ; get count
813 00071E 2644 MOV @PSP,W ; get address, leave
space on stack
814 000720 0A93 CMP #0,X
815 000722 0524 JZ SKIP_X
816 000724 6796 SKIP_1: CMP.B @W,TOS ; does character
match?
817 000726 0320 JNZ SKIP_X ; no, we are
done
818 000728 1653 ADD #1,W
819 00072A 1A83 SUB #1,X
820 00072C FB23 JNZ SKIP_1
821 00072E 84460000 SKIP_X: MOV W,0(PSP) ; store updated
address on
stack
822 000732 074A MOV X,TOS ; updated count to
TOS
823 000734 NEXT
823.1 000734 3645 MOV @IP+,W // ; fetch word address
into W
823.2 000736 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
823.3 000738 ENDM
824 000738
825 000738 ;Z SCAN c-addr u c -- c-addr' u'
826 000738 ;Z find matching char
827 000738 HEADER SCAN,4,'SCAN',DOCODE
827.1 000000 PUBLIC SCAN
827.2 000738 .... DW link
827.3 00073A FF DB 0FFh ; not immediate
827.4 00073B link SET $
827.5 00073B 04 DB 4
827.6 00073C 5343414E DB 'SCAN'
827.7 000740 EVEN
827.8 000740 IF 'DOCODE'='DOCODE'
827.9 000740 .... SCAN: DW $+2
827.10 000742 ELSE
827.11 000742 SCAN: DW DOCODE
827.12 000742 ENDIF
827.13 000742 ENDM
828 000742 3A44 MOV @PSP+,X ; get count
829 000744 2644 MOV @PSP,W ; get address, leave
space on stack
830 000746 0A93 CMP #0,X
831 000748 0524 JZ SCAN_X
832 00074A 6796 SCAN_1: CMP.B @W,TOS ; does character
match?
833 00074C 0324 JZ SCAN_X ; yes, we are
done
834 00074E 1653 ADD #1,W
835 000750 1A83 SUB #1,X
836 000752 FB23 JNZ SCAN_1
837 000754 84460000 SCAN_X: MOV W,0(PSP) ; store updated
address on
stack
838 000758 074A MOV X,TOS ; updated count to
TOS
839 00075A NEXT
839.1 00075A 3645 MOV @IP+,W // ; fetch word address
into W
839.2 00075C 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
839.3 00075E ENDM
840 00075E
841 00075E ;Z S= c-addr1 c-addr2 u -- n string
compare
842 00075E ;Z n<0: s10:
s1>s2
843 00075E HEADER SEQUAL,2,'S=',DOCODE
843.1 000000 PUBLIC SEQUAL
843.2 00075E .... DW link
843.3 000760 FF DB 0FFh ; not immediate
843.4 000761 link SET $
843.5 000761 02 DB 2
843.6 000762 533D DB 'S='
843.7 000764 EVEN
843.8 000764 IF 'DOCODE'='DOCODE'
843.9 000764 .... SEQUAL: DW $+2
843.10 000766 ELSE
843.11 000766 SEQUAL: DW DOCODE
843.12 000766 ENDIF
843.13 000766 ENDM
844 000766 3644 MOV @PSP+,W ; adrs2
845 000768 3A44 MOV @PSP+,X ; adrs1
846 00076A 0793 CMP #0,TOS
847 00076C 0A24 JZ SEQU_X
848 00076E FA960000 SEQU_1: CMP.B @W+,0(X) ; compare char1-char
2
849 000772 0420 JNZ SMISMATCH
850 000774 1A53 ADD #1,X
851 000776 1783 SUB #1,TOS
852 000778 FA23 JNZ SEQU_1
853 00077A ; no mismatch found, strings are equal,
TOS=0
854 00077A 033C JMP SEQU_X
855 00077C ; mismatch found, CY clear if borrow set
(s10:
s1>s2
863 000786 ; For Harvard model, c-addr1 is Data, c-addr2 is
Header.
864 000786 ; On MSP430, both use the same fetch instruction
, so N= is the same as S=.
865 000786 HEADER NEQUAL,2,'N=',SEQUAL+2
865.1 000000 PUBLIC NEQUAL
865.2 000786 .... DW link
865.3 000788 FF DB 0FFh ; not immediate
865.4 000789 link SET $
865.5 000789 02 DB 2
865.6 00078A 4E3D DB 'N='
865.7 00078C EVEN
865.8 00078C IF 'SEQUAL+2'='DOCODE'
865.9 00078C NEQUAL: DW $+2
865.10 00078C ELSE
865.11 00078C .... NEQUAL: DW SEQUAL+2
865.12 00078E ENDIF
865.13 00078E ENDM
866 00078E
867 00078E ; ----------------------------------------------
------------------------
868 00078E ; TERMINAL I/O
869 00078E
870 00078E ;C EMIT c -- output character to
console
871 00078E HEADER EMIT,4,'EMIT',DOCODE
871.1 000000 PUBLIC EMIT
871.2 00078E .... DW link
871.3 000790 FF DB 0FFh ; not immediate
871.4 000791 link SET $
871.5 000791 04 DB 4
871.6 000792 454D4954 DB 'EMIT'
871.7 000796 EVEN
871.8 000796 IF 'DOCODE'='DOCODE'
871.9 000796 .... EMIT: DW $+2
871.10 000798 ELSE
871.11 000798 EMIT: DW DOCODE
871.12 000798 ENDIF
871.13 000798 ENDM
872 000798 EMITLOOP:
873 000798 E2B30300 BIT.B #UCA0TXIFG,&IFG2
874 00079C FD27 JZ EMITLOOP
875 00079E C2476700 MOV.B TOS,&UCA0TXBUF
876 0007A2 3744 MOV @PSP+,TOS
877 0007A4 NEXT
877.1 0007A4 3645 MOV @IP+,W // ; fetch word address
into W
877.2 0007A6 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
877.3 0007A8 ENDM
878 0007A8
879 0007A8 ;C KEY -- c get character from
keyboard
880 0007A8 HEADER KEY,3,'KEY',DOCODE
880.1 000000 PUBLIC KEY
880.2 0007A8 .... DW link
880.3 0007AA FF DB 0FFh ; not immediate
880.4 0007AB link SET $
880.5 0007AB 03 DB 3
880.6 0007AC 4B4559 DB 'KEY'
880.7 0007AF 00 EVEN
880.8 0007B0 IF 'DOCODE'='DOCODE'
880.9 0007B0 .... KEY: DW $+2
880.10 0007B2 ELSE
880.11 0007B2 KEY: DW DOCODE
880.12 0007B2 ENDIF
880.13 0007B2 ENDM
881 0007B2 KEYLOOP:
882 0007B2 D2B30300 BIT.B #UCA0RXIFG,&IFG2
883 0007B6 FD27 JZ KEYLOOP
884 0007B8 2483 SUB #2,PSP ; 1 push old
TOS..
885 0007BA 84470000 MOV TOS,0(PSP) ; 4 ..onto
stack
886 0007BE 57426600 MOV.B &UCA0RXBUF,TOS ; read
character
into
TOS
887 0007C2 donoop:
888 0007C2 donext: NEXT
888.1 0007C2 3645 MOV @IP+,W // ; fetch word address
into W
888.2 0007C4 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
888.3 0007C6 ENDM
889 0007C6
890 0007C6 ;X KEY? -- f return true if char
waiting
891 0007C6 HEADER KEYQ,4,'KEY?',DOCODE
891.1 000000 PUBLIC KEYQ
891.2 0007C6 .... DW link
891.3 0007C8 FF DB 0FFh ; not immediate
891.4 0007C9 link SET $
891.5 0007C9 04 DB 4
891.6 0007CA 4B45593F DB 'KEY?'
891.7 0007CE EVEN
891.8 0007CE IF 'DOCODE'='DOCODE'
891.9 0007CE .... KEYQ: DW $+2
891.10 0007D0 ELSE
891.11 0007D0 KEYQ: DW DOCODE
891.12 0007D0 ENDIF
891.13 0007D0 ENDM
892 0007D0 2483 SUB #2,PSP ; 1 push old
TOS..
893 0007D2 84470000 MOV TOS,0(PSP) ; 4 ..onto
stack
894 0007D6 D2B30300 BIT.B #UCA0RXIFG,&IFG2
895 0007DA A722 JNZ TOSTRUE
896 0007DC 953E JMP TOSFALSE
897 0007DE
898 0007DE ; ----------------------------------------------
------------------------
899 0007DE ; We #include the following source files, rather
than compiling them
900 0007DE ; separately, so that they can inherit the value
of 'link'.
901 0007DE
902 0007DE #include "deps430G2553.s43"
1 0007DE ; ----------------------------------------------
------------------------
2 0007DE ; CF430G2553 is a Forth based on CamelForth
3 0007DE ; for the Texas Instruments MSP430
4 0007DE ;
5 0007DE ; This program is free software; you can
redistribute it and/or modify
6 0007DE ; it under the terms of the GNU General Public
License as published by
7 0007DE ; the Free Software Foundation; either version 3
of the License, or
8 0007DE ; (at your option) any later version.
9 0007DE ;
10 0007DE ; This program is distributed in the hope that
it will be useful,
11 0007DE ; but WITHOUT ANY WARRANTY; without even the
implied warranty of
12 0007DE ; MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the
13 0007DE ; GNU General Public License for more details.
14 0007DE ;
15 0007DE ; You should have received a copy of the GNU
General Public License
16 0007DE ; along with this program. If not, see
.
17 0007DE ;
18 0007DE ; See LICENSE TERMS in Brads file readme.txt as
well.
19 0007DE
20 0007DE ; ----------------------------------------------
------------------------
21 0007DE ; deps430.s43: CPU and Model Dependencies -
MSP430G2553
22 0007DE ; ----------------------------------------------
------------------------
23 0007DE
24 0007DE ; Forth words are documented as follows:
25 0007DE ;x NAME stack -- stack description
26 0007DE ; where x=C for ANS Forth Core words, X for
ANS
27 0007DE ; Extensions, Z for internal or private words,
U for Utilities.
28 0007DE ;
29 0007DE ; Indirect-Threaded Forth model for T.I.
MSP430
30 0007DE ; cell size is 16 bits (2 bytes)
31 0007DE ; char size is 8 bits (1 byte)
32 0007DE ; address unit is 8 bits (1 byte), i.e.,
addresses are byte-aligned.
33 0007DE ; ----------------------------------------------
------------------------
34 0007DE
35 0007DE ; ----------------------------------------------
------------------------
36 0007DE ; ALIGNMENT AND PORTABILITY OPERATORS
37 0007DE ; Many of these are synonyms for other
words,
38 0007DE ; and so are defined as CODE words.
39 0007DE
40 0007DE ;C ALIGN -- align
HERE
41 0007DE ; IHERE 1 AND IALLOT ;
42 0007DE HEADER ALIGNN,5,'ALIGN',DOCOLON
42.1 000000 PUBLIC ALIGNN
42.2 0007DE .... DW link
42.3 0007E0 FF DB 0FFh ; not immediate
42.4 0007E1 link SET $
42.5 0007E1 05 DB 5
42.6 0007E2 414C49474E DB 'ALIGN'
42.7 0007E7 00 EVEN
42.8 0007E8 IF 'DOCOLON'='DOCODE'
42.9 0007E8 ALIGNN: DW $+2
42.10 0007E8 ELSE
42.11 0007E8 .... ALIGNN: DW DOCOLON
42.12 0007EA ENDIF
42.13 0007EA ENDM
43 0007EA ........0100* DW IHERE,lit,1,ANDD,IALLOT,EXIT
44 0007F6
45 0007F6 ;C ALIGNED addr -- a-addr align given
addr
46 0007F6 ; DUP 1 AND + ;
47 0007F6 HEADER ALIGNED,7,'ALIGNED',DOCOLON
47.1 000000 PUBLIC ALIGNED
47.2 0007F6 .... DW link
47.3 0007F8 FF DB 0FFh ; not immediate
47.4 0007F9 link SET $
47.5 0007F9 07 DB 7
47.6 0007FA 414C49474E45* DB 'ALIGNED'
47.7 000801 00 EVEN
47.8 000802 IF 'DOCOLON'='DOCODE'
47.9 000802 ALIGNED: DW $+2
47.10 000802 ELSE
47.11 000802 .... ALIGNED: DW DOCOLON
47.12 000804 ENDIF
47.13 000804 ENDM
48 000804 ........0100* DW DUP,lit,1,ANDD,PLUS,EXIT
49 000810
50 000810 ;Z CELL -- n size of one
cell
51 000810 HEADER CELL,4,'CELL',DOCON
51.1 000000 PUBLIC CELL
51.2 000810 .... DW link
51.3 000812 FF DB 0FFh ; not immediate
51.4 000813 link SET $
51.5 000813 04 DB 4
51.6 000814 43454C4C DB 'CELL'
51.7 000818 EVEN
51.8 000818 IF 'DOCON'='DOCODE'
51.9 000818 CELL: DW $+2
51.10 000818 ELSE
51.11 000818 .... CELL: DW DOCON
51.12 00081A ENDIF
51.13 00081A ENDM
52 00081A 0200 dw 2
53 00081C
54 00081C ;C CELL+ a-addr1 -- a-addr2 add cell
size
55 00081C ; 2 + ;
56 00081C HEADER CELLPLUS,5,'CELL+',DOCODE
56.1 000000 PUBLIC CELLPLUS
56.2 00081C .... DW link
56.3 00081E FF DB 0FFh ; not immediate
56.4 00081F link SET $
56.5 00081F 05 DB 5
56.6 000820 43454C4C2B DB 'CELL+'
56.7 000825 00 EVEN
56.8 000826 IF 'DOCODE'='DOCODE'
56.9 000826 .... CELLPLUS: DW $+2
56.10 000828 ELSE
56.11 000828 CELLPLUS: DW DOCODE
56.12 000828 ENDIF
56.13 000828 ENDM
57 000828 2753 ADD #2,TOS
58 00082A CB3F JMP donext
59 00082C
60 00082C ;C CELLS n1 -- n2 cells->adrs
units
61 00082C HEADER CELLS,5,'CELLS',TWOSTAR+2
61.1 000000 PUBLIC CELLS
61.2 00082C .... DW link
61.3 00082E FF DB 0FFh ; not immediate
61.4 00082F link SET $
61.5 00082F 05 DB 5
61.6 000830 43454C4C53 DB 'CELLS'
61.7 000835 00 EVEN
61.8 000836 IF 'TWOSTAR+2'='DOCODE'
61.9 000836 CELLS: DW $+2
61.10 000836 ELSE
61.11 000836 .... CELLS: DW TWOSTAR+2
61.12 000838 ENDIF
61.13 000838 ENDM
62 000838
63 000838 ;C CHAR+ c-addr1 -- c-addr2 add char
size
64 000838 HEADER CHARPLUS,5,'CHAR+',ONEPLUS+2
64.1 000000 PUBLIC CHARPLUS
64.2 000838 .... DW link
64.3 00083A FF DB 0FFh ; not immediate
64.4 00083B link SET $
64.5 00083B 05 DB 5
64.6 00083C 434841522B DB 'CHAR+'
64.7 000841 00 EVEN
64.8 000842 IF 'ONEPLUS+2'='DOCODE'
64.9 000842 CHARPLUS: DW $+2
64.10 000842 ELSE
64.11 000842 .... CHARPLUS: DW ONEPLUS+2
64.12 000844 ENDIF
64.13 000844 ENDM
65 000844
66 000844 ;C CHARS n1 -- n2 chars->adrs
units
67 000844 HEADER CHARS,5,'CHARS',donoop
67.1 000000 PUBLIC CHARS
67.2 000844 .... DW link
67.3 000846 FF DB 0FFh ; not immediate
67.4 000847 link SET $
67.5 000847 05 DB 5
67.6 000848 4348415253 DB 'CHARS'
67.7 00084D 00 EVEN
67.8 00084E IF 'donoop'='DOCODE'
67.9 00084E CHARS: DW $+2
67.10 00084E ELSE
67.11 00084E .... CHARS: DW donoop
67.12 000850 ENDIF
67.13 000850 ENDM
68 000850
69 000850 ;C >BODY xt -- a-addr adrs of CREATE
data
70 000850 ; 2+ ; 8086 (3 byte
CALL)
71 000850 HEADER TOBODY,5,'>BODY',CELLPLUS+2
71.1 000000 PUBLIC TOBODY
71.2 000850 .... DW link
71.3 000852 FF DB 0FFh ; not immediate
71.4 000853 link SET $
71.5 000853 05 DB 5
71.6 000854 3E424F4459 DB '>BODY'
71.7 000859 00 EVEN
71.8 00085A IF 'CELLPLUS+2'='DOCODE'
71.9 00085A TOBODY: DW $+2
71.10 00085A ELSE
71.11 00085A .... TOBODY: DW CELLPLUS+2
71.12 00085C ENDIF
71.13 00085C ENDM
72 00085C
73 00085C ;X COMPILE, xt -- append execution
token
74 00085C ; I called this word ,XT before I discovered
that it is defined in the
75 00085C ; ANSI standard as COMPILE,. On a DTC Forth this
simply appends xt
76 00085C ; (like , ) but on an STC Forth this must append
'CALL xt'.
77 00085C HEADER COMMAXT,8,'COMPILE,',DOALIAS
77.1 000000 PUBLIC COMMAXT
77.2 00085C .... DW link
77.3 00085E FF DB 0FFh ; not immediate
77.4 00085F link SET $
77.5 00085F 08 DB 8
77.6 000860 434F4D50494C* DB 'COMPILE,'
77.7 000868 EVEN
77.8 000868 IF 'DOALIAS'='DOCODE'
77.9 000868 COMMAXT: DW $+2
77.10 000868 ELSE
77.11 000868 .... COMMAXT: DW DOALIAS
77.12 00086A ENDIF
77.13 00086A ENDM
78 00086A .... DW ICOMMA
79 00086C
80 00086C ;Z !CF adrs cfa -- set code action of a
word
81 00086C ; I! ;
82 00086C ; Indirect threaded model just stores adrs in
cfa field.
83 00086C HEADER STORECF,3,'!CF',DOALIAS
83.1 000000 PUBLIC STORECF
83.2 00086C .... DW link
83.3 00086E FF DB 0FFh ; not immediate
83.4 00086F link SET $
83.5 00086F 03 DB 3
83.6 000870 214346 DB '!CF'
83.7 000873 00 EVEN
83.8 000874 IF 'DOALIAS'='DOCODE'
83.9 000874 STORECF: DW $+2
83.10 000874 ELSE
83.11 000874 .... STORECF: DW DOALIAS
83.12 000876 ENDIF
83.13 000876 ENDM
84 000876 .... DW ISTORE
85 000878
86 000878 ;Z ,CF adrs -- append a code field
87 000878 ; IHERE !CF 2 IALLOT ; MSP430 VERSION (2
bytes)
88 000878 HEADER COMMACF,3,',CF',DOCOLON
88.1 000000 PUBLIC COMMACF
88.2 000878 .... DW link
88.3 00087A FF DB 0FFh ; not immediate
88.4 00087B link SET $
88.5 00087B 03 DB 3
88.6 00087C 2C4346 DB ',CF'
88.7 00087F 00 EVEN
88.8 000880 IF 'DOCOLON'='DOCODE'
88.9 000880 COMMACF: DW $+2
88.10 000880 ELSE
88.11 000880 .... COMMACF: DW DOCOLON
88.12 000882 ENDIF
88.13 000882 ENDM
89 000882 ............* DW IHERE,STORECF,lit,2,IALLOT,EXIT
90 00088E
91 00088E ;Z ,CALL adrs -- append a subroutine
CALL
92 00088E ; MSP430: 128x is call, Ad=11, Dreg=0000 (PC)
thus append 12B0,adrs.
93 00088E HEADER COMMACALL,5,',CALL',DOCOLON
93.1 000000 PUBLIC COMMACALL
93.2 00088E .... DW link
93.3 000890 FF DB 0FFh ; not immediate
93.4 000891 link SET $
93.5 000891 05 DB 5
93.6 000892 2C43414C4C DB ',CALL'
93.7 000897 00 EVEN
93.8 000898 IF 'DOCOLON'='DOCODE'
93.9 000898 COMMACALL: DW $+2
93.10 000898 ELSE
93.11 000898 .... COMMACALL: DW DOCOLON
93.12 00089A ENDIF
93.13 00089A ENDM
94 00089A ....B012....* DW lit,12B0h,ICOMMA,ICOMMA,EXIT
95 0008A4
96 0008A4 ;Z ,JMP adrs -- append an absolute
16-bit JMP (MOV #xx,PC)
97 0008A4 ; MSP430: opcode 4, Sreg=0000, Ad=0, As=11
(immed), Dreg=0000 (PC)
98 0008A4 ; thus append 4030,adrs.
99 0008A4 HEADER COMMAJMP,4,',JMP',DOCOLON
99.1 000000 PUBLIC COMMAJMP
99.2 0008A4 .... DW link
99.3 0008A6 FF DB 0FFh ; not immediate
99.4 0008A7 link SET $
99.5 0008A7 04 DB 4
99.6 0008A8 2C4A4D50 DB ',JMP'
99.7 0008AC EVEN
99.8 0008AC IF 'DOCOLON'='DOCODE'
99.9 0008AC COMMAJMP: DW $+2
99.10 0008AC ELSE
99.11 0008AC .... COMMAJMP: DW DOCOLON
99.12 0008AE ENDIF
99.13 0008AE ENDM
100 0008AE ....3040....* DW lit,4030h,ICOMMA,ICOMMA,EXIT
101 0008B8
102 0008B8 ;Z !COLON -- change code field to
DOCOLON
103 0008B8 ; -2 IALLOT DOCOLON-adrs ,CF ;
104 0008B8 ; This should be used immediately after
CREATE.
105 0008B8 ; This is made a distinct word, because on an
STC
106 0008B8 ; Forth, colon definitions have no code
field.
107 0008B8 HEADER STORCOLON,6,'!COLON',DOCOLON
107.1 000000 PUBLIC STORCOLON
107.2 0008B8 .... DW link
107.3 0008BA FF DB 0FFh ; not immediate
107.4 0008BB link SET $
107.5 0008BB 06 DB 6
107.6 0008BC 21434F4C4F4E DB '!COLON'
107.7 0008C2 EVEN
107.8 0008C2 IF 'DOCOLON'='DOCODE'
107.9 0008C2 STORCOLON: DW $+2
107.10 0008C2 ELSE
107.11 0008C2 .... STORCOLON: DW DOCOLON
107.12 0008C4 ENDIF
107.13 0008C4 ENDM
108 0008C4 ....FEFF.... DW lit,-2,IALLOT
109 0008CA ............* DW lit,DOCOLON,COMMACF,EXIT
110 0008D2
111 0008D2 ;Z ,EXIT -- append hi-level EXIT
action
112 0008D2 ; ['] EXIT ,XT ;
113 0008D2 ; This is made a distinct word, because on an
STC
114 0008D2 ; Forth, it appends a RET instruction, not an
xt.
115 0008D2 HEADER CEXIT,5,',EXIT',DOCOLON
115.1 000000 PUBLIC CEXIT
115.2 0008D2 .... DW link
115.3 0008D4 FF DB 0FFh ; not immediate
115.4 0008D5 link SET $
115.5 0008D5 05 DB 5
115.6 0008D6 2C45584954 DB ',EXIT'
115.7 0008DB 00 EVEN
115.8 0008DC IF 'DOCOLON'='DOCODE'
115.9 0008DC CEXIT: DW $+2
115.10 0008DC ELSE
115.11 0008DC .... CEXIT: DW DOCOLON
115.12 0008DE ENDIF
115.13 0008DE ENDM
116 0008DE ............* DW lit,EXIT,COMMAXT,EXIT
117 0008E6
118 0008E6 ; ----------------------------------------------
------------------------
119 0008E6 ; CONTROL STRUCTURES
120 0008E6 ; These words allow Forth control structure
words
121 0008E6 ; to be defined portably.
122 0008E6
123 0008E6 ;Z ,BRANCH xt -- append a branch instructio
n
124 0008E6 ; xt is the branch operator to use, e.g. qbranch
or (loop).
125 0008E6 ; It does NOT append the destination address.
126 0008E6 ; On the MSP430 this is equivalent to ,XT
(above).
127 0008E6 HEADER COMMABRANCH,7,',BRANCH',DOALIAS
127.1 000000 PUBLIC COMMABRANCH
127.2 0008E6 .... DW link
127.3 0008E8 FF DB 0FFh ; not immediate
127.4 0008E9 link SET $
127.5 0008E9 07 DB 7
127.6 0008EA 2C4252414E43* DB ',BRANCH'
127.7 0008F1 00 EVEN
127.8 0008F2 IF 'DOALIAS'='DOCODE'
127.9 0008F2 COMMABRANCH: DW $+2
127.10 0008F2 ELSE
127.11 0008F2 .... COMMABRANCH: DW DOALIAS
127.12 0008F4 ENDIF
127.13 0008F4 ENDM
128 0008F4 .... DW ICOMMA
129 0008F6
130 0008F6 ;Z ,DEST dest -- append a branch
address
131 0008F6 ; IHERE - , ;
132 0008F6 ; This appends the given destination address to
the branch instruction.
133 0008F6 ; The MSP430 uses relative addressing from the
location of the offset cell,
134 0008F6 ; i.e., to branch to FOO the offset cell at $
contains FOO-$.
135 0008F6 HEADER COMMADEST,5,',DEST',DOCOLON
135.1 000000 PUBLIC COMMADEST
135.2 0008F6 .... DW link
135.3 0008F8 FF DB 0FFh ; not immediate
135.4 0008F9 link SET $
135.5 0008F9 05 DB 5
135.6 0008FA 2C44455354 DB ',DEST'
135.7 0008FF 00 EVEN
135.8 000900 IF 'DOCOLON'='DOCODE'
135.9 000900 COMMADEST: DW $+2
135.10 000900 ELSE
135.11 000900 .... COMMADEST: DW DOCOLON
135.12 000902 ENDIF
135.13 000902 ENDM
136 000902 ............* DW IHERE,MINUS,ICOMMA,EXIT
137 00090A
138 00090A ;Z !DEST dest adrs -- change a branch
dest'n
139 00090A ; TUCK - SWAP I! ;
140 00090A ; Changes the destination address found at
'adrs' to the given 'dest'.
141 00090A ; The MSP430 uses relative addressing from the
location of the offset cell,
142 00090A ; i.e., to branch to FOO the offset cell at $
contains FOO-$.
143 00090A HEADER STOREDEST,5,'!DEST',DOCOLON
143.1 000000 PUBLIC STOREDEST
143.2 00090A .... DW link
143.3 00090C FF DB 0FFh ; not immediate
143.4 00090D link SET $
143.5 00090D 05 DB 5
143.6 00090E 2144455354 DB '!DEST'
143.7 000913 00 EVEN
143.8 000914 IF 'DOCOLON'='DOCODE'
143.9 000914 STOREDEST: DW $+2
143.10 000914 ELSE
143.11 000914 .... STOREDEST: DW DOCOLON
143.12 000916 ENDIF
143.13 000916 ENDM
144 000916 ............* DW TUCK,MINUS,SWAP,ISTORE,EXIT
145 000920
146 000920 ;Z ,NONE -- append a null
destination (Flashable)
147 000920 ; CELL IALLOT ;
148 000920 ; When compiling in Flash ROM a branch to be
resolved later, we must
149 000920 ; skip the cell so that it can be programmed at
a later time.
150 000920 ; In general Flash memory can only be written
once!
151 000920 ; ,NONE should be used wherever !DEST will
resolve the branch.
152 000920 HEADER COMMANONE,5,',NONE',DOCOLON
152.1 000000 PUBLIC COMMANONE
152.2 000920 .... DW link
152.3 000922 FF DB 0FFh ; not immediate
152.4 000923 link SET $
152.5 000923 05 DB 5
152.6 000924 2C4E4F4E45 DB ',NONE'
152.7 000929 00 EVEN
152.8 00092A IF 'DOCOLON'='DOCODE'
152.9 00092A COMMANONE: DW $+2
152.10 00092A ELSE
152.11 00092A .... COMMANONE: DW DOCOLON
152.12 00092C ENDIF
152.13 00092C ENDM
153 00092C ............ DW CELL,IALLOT,EXIT
154 000932
155 000932 ; ----------------------------------------------
------------------------
156 000932 ; HEADER STRUCTURE
157 000932 ; The structure of the Forth dictionary headers
(name, link, immediate
158 000932 ; flag, and "smudge" bit) does not necessarily
differ across CPUs. This
159 000932 ; structure is not easily factored into distinct
"portable" words;
160 000932 ; instead, it is implicit in the definitions of
FIND and CREATE, and
161 000932 ; also in NFA>LFA, NFA>CFA, IMMED?, IMMEDIATE,
HIDE, and REVEAL.
162 000932 ; These words must be (substantially) rewritten
if either the header
163 000932 ; structure or its inherent assumptions are
changed.
164 000932
903 000932 #include "hilvl430G2553.s43"
1 000932 ; ----------------------------------------------
------------------------
2 000932 ; CF430G2553 is a Forth based on CamelForth
3 000932 ; for the Texas Instruments MSP430
4 000932 ;
5 000932 ; This program is free software; you can
redistribute it and/or modify
6 000932 ; it under the terms of the GNU General Public
License as published by
7 000932 ; the Free Software Foundation; either version 3
of the License, or
8 000932 ; (at your option) any later version.
9 000932 ;
10 000932 ; This program is distributed in the hope that
it will be useful,
11 000932 ; but WITHOUT ANY WARRANTY; without even the
implied warranty of
12 000932 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the
13 000932 ; GNU General Public License for more details.
14 000932 ;
15 000932 ; You should have received a copy of the GNU
General Public License
16 000932 ; along with this program. If not, see
.
17 000932 ;
18 000932 ; See LICENSE TERMS in Brads file readme.txt as
well.
19 000932
20 000932 ; ----------------------------------------------
------------------------
21 000932 ; hilvl430G2553.s43 - High Level Words -
MSP430G2553
22 000932 ; ----------------------------------------------
------------------------
23 000932
24 000932 ; Forth words are documented as follows:
25 000932 ;x NAME stack -- stack description
26 000932 ; where x=C for ANS Forth Core words, X for
ANS
27 000932 ; Extensions, Z for internal or private
words.
28 000932 ; ----------------------------------------------
------------------------
29 000932 ; REVISION HISTORY
30 000932
31 000932 ; 30 Mar 2012 mk fixed FM/MOD
32 000932 ; 26 Feb 2012 mk - adopted to MSP430G2553
33 000932 ; kernel at $E000, IDP = FLASHSTART =
C000
34 000932 ; fixed backspace.
35 000932 ; ok promt at end of line.
36 000932 ; .S prints depth.
37 000932 ;
38 000932 ; 17 jan 09 bjr - changed label _DP to DDP for
compatibility with token
39 000932 ; naming convention. Now uses DEST macro to
compute branch offsets.
40 000932 ; 11 jan 09 bjr - modified QUIT for Xon/Xoff
flow control
41 000932 ; 4 jan 09 bjr - created from Camel86h.asm.
42 000932
43 000932 ; SYSTEM VARIABLES & CONSTANTS =================
=
44 000932
45 000932 ;Z u0 -- a-addr current user area
adrs
46 000932 ; 0 USER U0
47 000932 HEADER U0,2,'U0',DOUSER
47.1 000000 PUBLIC U0
47.2 000932 .... DW link
47.3 000934 FF DB 0FFh ; not immediate
47.4 000935 link SET $
47.5 000935 02 DB 2
47.6 000936 5530 DB 'U0'
47.7 000938 EVEN
47.8 000938 IF 'DOUSER'='DOCODE'
47.9 000938 U0: DW $+2
47.10 000938 ELSE
47.11 000938 .... U0: DW DOUSER
47.12 00093A ENDIF
47.13 00093A ENDM
48 00093A 0000 DW 0
49 00093C
50 00093C ;C >IN -- a-addr holds offset into
TIB
51 00093C ; 2 USER >IN
52 00093C HEADER TOIN,3,'>IN',DOUSER
52.1 000000 PUBLIC TOIN
52.2 00093C .... DW link
52.3 00093E FF DB 0FFh ; not immediate
52.4 00093F link SET $
52.5 00093F 03 DB 3
52.6 000940 3E494E DB '>IN'
52.7 000943 00 EVEN
52.8 000944 IF 'DOUSER'='DOCODE'
52.9 000944 TOIN: DW $+2
52.10 000944 ELSE
52.11 000944 .... TOIN: DW DOUSER
52.12 000946 ENDIF
52.13 000946 ENDM
53 000946 0200 DW 2
54 000948
55 000948 ;C BASE -- a-addr holds conversion
radix
56 000948 ; 4 USER BASE
57 000948 HEADER BASE,4,'BASE',DOUSER
57.1 000000 PUBLIC BASE
57.2 000948 .... DW link
57.3 00094A FF DB 0FFh ; not immediate
57.4 00094B link SET $
57.5 00094B 04 DB 4
57.6 00094C 42415345 DB 'BASE'
57.7 000950 EVEN
57.8 000950 IF 'DOUSER'='DOCODE'
57.9 000950 BASE: DW $+2
57.10 000950 ELSE
57.11 000950 .... BASE: DW DOUSER
57.12 000952 ENDIF
57.13 000952 ENDM
58 000952 0400 DW 4
59 000954
60 000954 ;C STATE -- a-addr holds compiler
state
61 000954 ; 6 USER STATE
62 000954 HEADER STATE,5,'STATE',DOUSER
62.1 000000 PUBLIC STATE
62.2 000954 .... DW link
62.3 000956 FF DB 0FFh ; not immediate
62.4 000957 link SET $
62.5 000957 05 DB 5
62.6 000958 5354415445 DB 'STATE'
62.7 00095D 00 EVEN
62.8 00095E IF 'DOUSER'='DOCODE'
62.9 00095E STATE: DW $+2
62.10 00095E ELSE
62.11 00095E .... STATE: DW DOUSER
62.12 000960 ENDIF
62.13 000960 ENDM
63 000960 0600 DW 6
64 000962
65 000962 ;Z dp -- a-addr holds dictionary
ptr
66 000962 ; 8 USER DP
67 000962 HEADER DDP,2,'DP',DOUSER
67.1 000000 PUBLIC DDP
67.2 000962 .... DW link
67.3 000964 FF DB 0FFh ; not immediate
67.4 000965 link SET $
67.5 000965 02 DB 2
67.6 000966 4450 DB 'DP'
67.7 000968 EVEN
67.8 000968 IF 'DOUSER'='DOCODE'
67.9 000968 DDP: DW $+2
67.10 000968 ELSE
67.11 000968 .... DDP: DW DOUSER
67.12 00096A ENDIF
67.13 00096A ENDM
68 00096A 0800 DW 8
69 00096C
70 00096C ;Z 'source -- a-addr two cells: len,
adrs
71 00096C ; 10 USER 'SOURCE
72 00096C HEADER TICKSOURCE,7,'\'SOURCE',DOUSER
72.1 000000 PUBLIC TICKSOURCE
72.2 00096C .... DW link
72.3 00096E FF DB 0FFh ; not immediate
72.4 00096F link SET $
72.5 00096F 07 DB 7
72.6 000970 27534F555243* DB '\'SOURCE'
72.7 000977 00 EVEN
72.8 000978 IF 'DOUSER'='DOCODE'
72.9 000978 TICKSOURCE: DW $+2
72.10 000978 ELSE
72.11 000978 .... TICKSOURCE: DW DOUSER
72.12 00097A ENDIF
72.13 00097A ENDM
73 00097A 0A00 DW 10
74 00097C
75 00097C ;Z latest -- a-addr last word in
dict.
76 00097C ; 14 USER LATEST
77 00097C HEADER LATEST,6,'LATEST',DOUSER
77.1 000000 PUBLIC LATEST
77.2 00097C .... DW link
77.3 00097E FF DB 0FFh ; not immediate
77.4 00097F link SET $
77.5 00097F 06 DB 6
77.6 000980 4C4154455354 DB 'LATEST'
77.7 000986 EVEN
77.8 000986 IF 'DOUSER'='DOCODE'
77.9 000986 LATEST: DW $+2
77.10 000986 ELSE
77.11 000986 .... LATEST: DW DOUSER
77.12 000988 ENDIF
77.13 000988 ENDM
78 000988 0E00 DW 14
79 00098A
80 00098A ;Z hp -- a-addr HOLD pointer
81 00098A ; 16 USER HP
82 00098A HEADER HP,2,'HP',DOUSER
82.1 000000 PUBLIC HP
82.2 00098A .... DW link
82.3 00098C FF DB 0FFh ; not immediate
82.4 00098D link SET $
82.5 00098D 02 DB 2
82.6 00098E 4850 DB 'HP'
82.7 000990 EVEN
82.8 000990 IF 'DOUSER'='DOCODE'
82.9 000990 HP: DW $+2
82.10 000990 ELSE
82.11 000990 .... HP: DW DOUSER
82.12 000992 ENDIF
82.13 000992 ENDM
83 000992 1000 DW 16
84 000994
85 000994 ;Z LP -- a-addr Leave-stack pointer
86 000994 ; 18 USER LP
87 000994 HEADER LP,2,'LP',DOUSER
87.1 000000 PUBLIC LP
87.2 000994 .... DW link
87.3 000996 FF DB 0FFh ; not immediate
87.4 000997 link SET $
87.5 000997 02 DB 2
87.6 000998 4C50 DB 'LP'
87.7 00099A EVEN
87.8 00099A IF 'DOUSER'='DOCODE'
87.9 00099A LP: DW $+2
87.10 00099A ELSE
87.11 00099A .... LP: DW DOUSER
87.12 00099C ENDIF
87.13 00099C ENDM
88 00099C 1200 DW 18
89 00099E
90 00099E ;Z IDP -- a-addr ROM dictionary
pointer
91 00099E ; 20 USER IDP
92 00099E HEADER IDP,3,'IDP',DOUSER
92.1 000000 PUBLIC IDP
92.2 00099E .... DW link
92.3 0009A0 FF DB 0FFh ; not immediate
92.4 0009A1 link SET $
92.5 0009A1 03 DB 3
92.6 0009A2 494450 DB 'IDP'
92.7 0009A5 00 EVEN
92.8 0009A6 IF 'DOUSER'='DOCODE'
92.9 0009A6 IDP: DW $+2
92.10 0009A6 ELSE
92.11 0009A6 .... IDP: DW DOUSER
92.12 0009A8 ENDIF
92.13 0009A8 ENDM
93 0009A8 1400 DW 20
94 0009AA
95 0009AA ;Z NEWEST -- a-addr temporary LATEST
storage
96 0009AA ; 22 USER NEWEST
97 0009AA HEADER NEWEST,6,'NEWEST',DOUSER
97.1 000000 PUBLIC NEWEST
97.2 0009AA .... DW link
97.3 0009AC FF DB 0FFh ; not immediate
97.4 0009AD link SET $
97.5 0009AD 06 DB 6
97.6 0009AE 4E4557455354 DB 'NEWEST'
97.7 0009B4 EVEN
97.8 0009B4 IF 'DOUSER'='DOCODE'
97.9 0009B4 NEWEST: DW $+2
97.10 0009B4 ELSE
97.11 0009B4 .... NEWEST: DW DOUSER
97.12 0009B6 ENDIF
97.13 0009B6 ENDM
98 0009B6 1600 DW 22
99 0009B8
100 0009B8 ;Z APP -- a-addr xt of app ( was
TURNKEY)
101 0009B8 ; 24 USER APP
102 0009B8 HEADER APP,3,'APP',DOUSER
102.1 000000 PUBLIC APP
102.2 0009B8 .... DW link
102.3 0009BA FF DB 0FFh ; not immediate
102.4 0009BB link SET $
102.5 0009BB 03 DB 3
102.6 0009BC 415050 DB 'APP'
102.7 0009BF 00 EVEN
102.8 0009C0 IF 'DOUSER'='DOCODE'
102.9 0009C0 APP: DW $+2
102.10 0009C0 ELSE
102.11 0009C0 .... APP: DW DOUSER
102.12 0009C2 ENDIF
102.13 0009C2 ENDM
103 0009C2 1800 DW 24
104 0009C4
105 0009C4 ;Z CAPS -- a-addr capitalize
words
106 0009C4 ; 26 USER CAPS
107 0009C4 HEADER CAPS,4,'CAPS',DOUSER
107.1 000000 PUBLIC CAPS
107.2 0009C4 .... DW link
107.3 0009C6 FF DB 0FFh ; not immediate
107.4 0009C7 link SET $
107.5 0009C7 04 DB 4
107.6 0009C8 43415053 DB 'CAPS'
107.7 0009CC EVEN
107.8 0009CC IF 'DOUSER'='DOCODE'
107.9 0009CC CAPS: DW $+2
107.10 0009CC ELSE
107.11 0009CC .... CAPS: DW DOUSER
107.12 0009CE ENDIF
107.13 0009CE ENDM
108 0009CE 1A00 DW 26
109 0009D0
110 0009D0 ; user variables 28,30 tbd
111 0009D0
112 0009D0 ;X PAD -- a-addr user PAD buffer
113 0009D0 ; = end of hold
area!
114 0009D0 HEADER PAD,3,'PAD',DOUSER
114.1 000000 PUBLIC PAD
114.2 0009D0 .... DW link
114.3 0009D2 FF DB 0FFh ; not immediate
114.4 0009D3 link SET $
114.5 0009D3 03 DB 3
114.6 0009D4 504144 DB 'PAD'
114.7 0009D7 00 EVEN
114.8 0009D8 IF 'DOUSER'='DOCODE'
114.9 0009D8 PAD: DW $+2
114.10 0009D8 ELSE
114.11 0009D8 .... PAD: DW DOUSER
114.12 0009DA ENDIF
114.13 0009DA ENDM
115 0009DA .... DW PADAREA-UAREA
116 0009DC
117 0009DC ;Z l0 -- a-addr bottom of Leave
stack
118 0009DC HEADER L0,2,'L0',DOUSER
118.1 000000 PUBLIC L0
118.2 0009DC .... DW link
118.3 0009DE FF DB 0FFh ; not immediate
118.4 0009DF link SET $
118.5 0009DF 02 DB 2
118.6 0009E0 4C30 DB 'L0'
118.7 0009E2 EVEN
118.8 0009E2 IF 'DOUSER'='DOCODE'
118.9 0009E2 L0: DW $+2
118.10 0009E2 ELSE
118.11 0009E2 .... L0: DW DOUSER
118.12 0009E4 ENDIF
118.13 0009E4 ENDM
119 0009E4 .... DW LSTACK-UAREA
120 0009E6
121 0009E6 ;Z r0 -- a-addr end of return
stack
122 0009E6 HEADER RZERO,2,'R0',DOUSER
122.1 000000 PUBLIC RZERO
122.2 0009E6 .... DW link
122.3 0009E8 FF DB 0FFh ; not immediate
122.4 0009E9 link SET $
122.5 0009E9 02 DB 2
122.6 0009EA 5230 DB 'R0'
122.7 0009EC EVEN
122.8 0009EC IF 'DOUSER'='DOCODE'
122.9 0009EC RZERO: DW $+2
122.10 0009EC ELSE
122.11 0009EC .... RZERO: DW DOUSER
122.12 0009EE ENDIF
122.13 0009EE ENDM
123 0009EE .... DW RSTACK-UAREA
124 0009F0
125 0009F0 ;Z s0 -- a-addr end of parameter
stack
126 0009F0 HEADER S0,2,'S0',DOUSER
126.1 000000 PUBLIC S0
126.2 0009F0 .... DW link
126.3 0009F2 FF DB 0FFh ; not immediate
126.4 0009F3 link SET $
126.5 0009F3 02 DB 2
126.6 0009F4 5330 DB 'S0'
126.7 0009F6 EVEN
126.8 0009F6 IF 'DOUSER'='DOCODE'
126.9 0009F6 S0: DW $+2
126.10 0009F6 ELSE
126.11 0009F6 .... S0: DW DOUSER
126.12 0009F8 ENDIF
126.13 0009F8 ENDM
127 0009F8 .... DW PSTACK-UAREA
128 0009FA
129 0009FA ;X tib -- a-addr Terminal Input
Buffer
130 0009FA ; HEX 80 USER TIB 8086: above user
area
131 0009FA HEADER TIB,3,'TIB',DOUSER
131.1 000000 PUBLIC TIB
131.2 0009FA .... DW link
131.3 0009FC FF DB 0FFh ; not immediate
131.4 0009FD link SET $
131.5 0009FD 03 DB 3
131.6 0009FE 544942 DB 'TIB'
131.7 000A01 00 EVEN
131.8 000A02 IF 'DOUSER'='DOCODE'
131.9 000A02 TIB: DW $+2
131.10 000A02 ELSE
131.11 000A02 .... TIB: DW DOUSER
131.12 000A04 ENDIF
131.13 000A04 ENDM
132 000A04 .... DW TIBAREA-UAREA
133 000A06
134 000A06 ;Z tibsize -- n size of TIB
135 000A06 HEADER TIBSIZE,7,'TIBSIZE',DOCON
135.1 000000 PUBLIC TIBSIZE
135.2 000A06 .... DW link
135.3 000A08 FF DB 0FFh ; not immediate
135.4 000A09 link SET $
135.5 000A09 07 DB 7
135.6 000A0A 54494253495A* DB 'TIBSIZE'
135.7 000A11 00 EVEN
135.8 000A12 IF 'DOCON'='DOCODE'
135.9 000A12 TIBSIZE: DW $+2
135.10 000A12 ELSE
135.11 000A12 .... TIBSIZE: DW DOCON
135.12 000A14 ENDIF
135.13 000A14 ENDM
136 000A14 .... DW TIB_SIZE-2 ; 2 chars safety zone
137 000A16
138 000A16 ;C BL -- char an ASCII
space
139 000A16 HEADER BLANK,2,'BL',DOCON
139.1 000000 PUBLIC BLANK
139.2 000A16 .... DW link
139.3 000A18 FF DB 0FFh ; not immediate
139.4 000A19 link SET $
139.5 000A19 02 DB 2
139.6 000A1A 424C DB 'BL'
139.7 000A1C EVEN
139.8 000A1C IF 'DOCON'='DOCODE'
139.9 000A1C BLANK: DW $+2
139.10 000A1C ELSE
139.11 000A1C .... BLANK: DW DOCON
139.12 000A1E ENDIF
139.13 000A1E ENDM
140 000A1E 2000 DW 20h
141 000A20
142 000A20 ;Z uinit -- addr initial values for user
area
143 000A20 ; MSP430: we also use this to initialize the RAM
interrupt
144 000A20 ; vectors, which immediately follow the user
area.
145 000A20 ; Per init430f1611.s43, allocate 16 cells for
user
146 000A20 ; variables, followed by 30 cells for interrupt
vectors.
147 000A20 HEADER UINIT,5,'UINIT',DOROM
147.1 000000 PUBLIC UINIT
147.2 000A20 .... DW link
147.3 000A22 FF DB 0FFh ; not immediate
147.4 000A23 link SET $
147.5 000A23 05 DB 5
147.6 000A24 55494E4954 DB 'UINIT'
147.7 000A29 00 EVEN
147.8 000A2A IF 'DOROM'='DOCODE'
147.9 000A2A UINIT: DW $+2
147.10 000A2A ELSE
147.11 000A2A .... UINIT: DW DOROM
147.12 000A2C ENDIF
147.13 000A2C ENDM
148 000A2C 000000000A00* DW 0,0,10,0 ; reserved,>IN,BASE,STAT
E ; start in HEX
mk
149 000A34 .... DW RAMDICT ; DP
150 000A36 00000000 DW 0,0 ; SOURCE init'd
elsewhere
151 000A3A .... DW lastword ; LATEST
152 000A3C 00000000 DW 0,0 ; HP,LP init'd
elsewhere
153 000A40 00C0 DW FLASHSTART ; IDP
154 000A42 0000 DW 0 ; NEWEST not init'd
155 000A44 .... DW DOTCOLD ; app
156 000A46 FFFF DW -1 ; CAPS on
157 000A48 00000000 DW 0,0 ; user variables
TBD
158 000A4C
159 000A4C /* not there mk
160 000A4C ; RAM interrupt vectors, 15 vectors of 2 cells
each
161 000A4C MOV #nullirq,PC
162 000A4C MOV #nullirq,PC
163 000A4C MOV #nullirq,PC
164 000A4C MOV #nullirq,PC
165 000A4C MOV #nullirq,PC
166 000A4C MOV #nullirq,PC
167 000A4C MOV #nullirq,PC
168 000A4C MOV #nullirq,PC
169 000A4C MOV #nullirq,PC
170 000A4C MOV #nullirq,PC
171 000A4C MOV #nullirq,PC
172 000A4C MOV #nullirq,PC
173 000A4C MOV #nullirq,PC
174 000A4C MOV #nullirq,PC
175 000A4C MOV #nullirq,PC
176 000A4C */
177 000A4C
178 000A4C ;Z #init -- n #bytes of user area init
data
179 000A4C HEADER NINIT,5,'#INIT',DOCON
179.1 000000 PUBLIC NINIT
179.2 000A4C .... DW link
179.3 000A4E FF DB 0FFh ; not immediate
179.4 000A4F link SET $
179.5 000A4F 05 DB 5
179.6 000A50 23494E4954 DB '#INIT'
179.7 000A55 00 EVEN
179.8 000A56 IF 'DOCON'='DOCODE'
179.9 000A56 NINIT: DW $+2
179.10 000A56 ELSE
179.11 000A56 .... NINIT: DW DOCON
179.12 000A58 ENDIF
179.13 000A58 ENDM
180 000A58 .... DW (UAREA_SIZE)*2 ; SIZEs given in
cells
181 000A5A
182 000A5A
183 000000 EXTERN cor,infoB,AppU0
184 000A5A ;Z COR -- adr cause of reset
185 000A5A HEADER COR,3,'COR',DOCON
185.1 000000 PUBLIC COR
185.2 000A5A .... DW link
185.3 000A5C FF DB 0FFh ; not immediate
185.4 000A5D link SET $
185.5 000A5D 03 DB 3
185.6 000A5E 434F52 DB 'COR'
185.7 000A61 00 EVEN
185.8 000A62 IF 'DOCON'='DOCODE'
185.9 000A62 COR: DW $+2
185.10 000A62 ELSE
185.11 000A62 .... COR: DW DOCON
185.12 000A64 ENDIF
185.13 000A64 ENDM
186 000A64 .... DW cor
187 000A66
188 000A66 ;Z INFOB -- adr start of info B
segment
189 000A66 HEADER INFOB,5,'INFOB',DOCON
189.1 000000 PUBLIC INFOB
189.2 000A66 .... DW link
189.3 000A68 FF DB 0FFh ; not immediate
189.4 000A69 link SET $
189.5 000A69 05 DB 5
189.6 000A6A 494E464F42 DB 'INFOB'
189.7 000A6F 00 EVEN
189.8 000A70 IF 'DOCON'='DOCODE'
189.9 000A70 INFOB: DW $+2
189.10 000A70 ELSE
189.11 000A70 .... INFOB: DW DOCON
189.12 000A72 ENDIF
189.13 000A72 ENDM
190 000A72 .... DW infoB
191 000A74
192 000A74 ;Z APPU0 -- adr start of Application
user area
193 000A74 HEADER APPU0,5,'APPU0',DOCON
193.1 000000 PUBLIC APPU0
193.2 000A74 .... DW link
193.3 000A76 FF DB 0FFh ; not immediate
193.4 000A77 link SET $
193.5 000A77 05 DB 5
193.6 000A78 4150505530 DB 'APPU0'
193.7 000A7D 00 EVEN
193.8 000A7E IF 'DOCON'='DOCODE'
193.9 000A7E APPU0: DW $+2
193.10 000A7E ELSE
193.11 000A7E .... APPU0: DW DOCON
193.12 000A80 ENDIF
193.13 000A80 ENDM
194 000A80 .... DW AppU0
195 000A82
196 000A82
197 000A82 ; ARITHMETIC OPERATORS =========================
=
198 000A82
199 000A82 ;C S>D n -- d single -> double
prec.
200 000A82 ; DUP 0< ;
201 000A82 HEADER STOD,3,'S>D',DOCOLON
201.1 000000 PUBLIC STOD
201.2 000A82 .... DW link
201.3 000A84 FF DB 0FFh ; not immediate
201.4 000A85 link SET $
201.5 000A85 03 DB 3
201.6 000A86 533E44 DB 'S>D'
201.7 000A89 00 EVEN
201.8 000A8A IF 'DOCOLON'='DOCODE'
201.9 000A8A STOD: DW $+2
201.10 000A8A ELSE
201.11 000A8A .... STOD: DW DOCOLON
201.12 000A8C ENDIF
201.13 000A8C ENDM
202 000A8C ............ DW DUP,ZEROLESS,EXIT
203 000A92
204 000A92 ;Z ?NEGATE n1 n2 -- n3 negate n1 if n2
negative
205 000A92 ; 0< IF NEGATE THEN ; ...a common
factor
206 000A92 HEADER QNEGATE,7,'?NEGATE',DOCOLON
206.1 000000 PUBLIC QNEGATE
206.2 000A92 .... DW link
206.3 000A94 FF DB 0FFh ; not immediate
206.4 000A95 link SET $
206.5 000A95 07 DB 7
206.6 000A96 3F4E45474154* DB '?NEGATE'
206.7 000A9D 00 EVEN
206.8 000A9E IF 'DOCOLON'='DOCODE'
206.9 000A9E QNEGATE: DW $+2
206.10 000A9E ELSE
206.11 000A9E .... QNEGATE: DW DOCOLON
206.12 000AA0 ENDIF
206.13 000AA0 ENDM
207 000AA0 ........ DW ZEROLESS,qbran
208 000AA4 DEST QNEG1
208.1 000AA4 0400 DW QNEG1-$
208.2 000AA6 ENDM
209 000AA6 .... DW NEGATE
210 000AA8 .... QNEG1: DW EXIT
211 000AAA
212 000AAA ;C ABS n1 -- +n2 absolute value
213 000AAA ; DUP ?NEGATE ;
214 000AAA HEADER ABBS,3,'ABS',DOCOLON
214.1 000000 PUBLIC ABBS
214.2 000AAA .... DW link
214.3 000AAC FF DB 0FFh ; not immediate
214.4 000AAD link SET $
214.5 000AAD 03 DB 3
214.6 000AAE 414253 DB 'ABS'
214.7 000AB1 00 EVEN
214.8 000AB2 IF 'DOCOLON'='DOCODE'
214.9 000AB2 ABBS: DW $+2
214.10 000AB2 ELSE
214.11 000AB2 .... ABBS: DW DOCOLON
214.12 000AB4 ENDIF
214.13 000AB4 ENDM
215 000AB4 ............ DW DUP,QNEGATE,EXIT
216 000ABA
217 000ABA ;X DNEGATE d1 -- d2 negate double
precision
218 000ABA ; SWAP INVERT SWAP INVERT 1 M+ ;
219 000ABA HEADER DNEGATE,7,'DNEGATE',DOCOLON
219.1 000000 PUBLIC DNEGATE
219.2 000ABA .... DW link
219.3 000ABC FF DB 0FFh ; not immediate
219.4 000ABD link SET $
219.5 000ABD 07 DB 7
219.6 000ABE 444E45474154* DB 'DNEGATE'
219.7 000AC5 00 EVEN
219.8 000AC6 IF 'DOCOLON'='DOCODE'
219.9 000AC6 DNEGATE: DW $+2
219.10 000AC6 ELSE
219.11 000AC6 .... DNEGATE: DW DOCOLON
219.12 000AC8 ENDIF
219.13 000AC8 ENDM
220 000AC8 ............* DW SWAP,INVERT,SWAP,INVERT,lit,1,MPLUS
221 000AD6 .... DW EXIT
222 000AD8
223 000AD8 ;Z ?DNEGATE d1 n -- d2 negate d1 if n
negative
224 000AD8 ; 0< IF DNEGATE THEN ; ...a common
factor
225 000AD8 HEADER QDNEGATE,8,'?DNEGATE',DOCOLON
225.1 000000 PUBLIC QDNEGATE
225.2 000AD8 .... DW link
225.3 000ADA FF DB 0FFh ; not immediate
225.4 000ADB link SET $
225.5 000ADB 08 DB 8
225.6 000ADC 3F444E454741* DB '?DNEGATE'
225.7 000AE4 EVEN
225.8 000AE4 IF 'DOCOLON'='DOCODE'
225.9 000AE4 QDNEGATE: DW $+2
225.10 000AE4 ELSE
225.11 000AE4 .... QDNEGATE: DW DOCOLON
225.12 000AE6 ENDIF
225.13 000AE6 ENDM
226 000AE6 ........ DW ZEROLESS,qbran
227 000AEA DEST DNEG1
227.1 000AEA 0400 DW DNEG1-$
227.2 000AEC ENDM
228 000AEC .... DW DNEGATE
229 000AEE .... DNEG1: DW EXIT
230 000AF0
231 000AF0 ;X DABS d1 -- +d2 absolute value
dbl.prec.
232 000AF0 ; DUP ?DNEGATE ;
233 000AF0 HEADER DABS,4,'DABS',DOCOLON
233.1 000000 PUBLIC DABS
233.2 000AF0 .... DW link
233.3 000AF2 FF DB 0FFh ; not immediate
233.4 000AF3 link SET $
233.5 000AF3 04 DB 4
233.6 000AF4 44414253 DB 'DABS'
233.7 000AF8 EVEN
233.8 000AF8 IF 'DOCOLON'='DOCODE'
233.9 000AF8 DABS: DW $+2
233.10 000AF8 ELSE
233.11 000AF8 .... DABS: DW DOCOLON
233.12 000AFA ENDIF
233.13 000AFA ENDM
234 000AFA ............ DW DUP,QDNEGATE,EXIT
235 000B00
236 000B00 ;C M* n1 n2 -- d signed 16*16->32
multiply
237 000B00 ; 2DUP XOR >R carries sign of the
result
238 000B00 ; SWAP ABS SWAP ABS UM*
239 000B00 ; R> ?DNEGATE ;
240 000B00 HEADER MSTAR,2,'M*',DOCOLON
240.1 000000 PUBLIC MSTAR
240.2 000B00 .... DW link
240.3 000B02 FF DB 0FFh ; not immediate
240.4 000B03 link SET $
240.5 000B03 02 DB 2
240.6 000B04 4D2A DB 'M*'
240.7 000B06 EVEN
240.8 000B06 IF 'DOCOLON'='DOCODE'
240.9 000B06 MSTAR: DW $+2
240.10 000B06 ELSE
240.11 000B06 .... MSTAR: DW DOCOLON
240.12 000B08 ENDIF
240.13 000B08 ENDM
241 000B08 ............ DW TWODUP,XORR,TOR
242 000B0E ............* DW SWAP,ABBS,SWAP,ABBS,UMSTAR
243 000B18 ............ DW RFROM,QDNEGATE,EXIT
244 000B1E
245 000B1E ;C SM/REM d1 n1 -- n2 n3 symmetric signed
div
246 000B1E ; 2DUP XOR >R sign of quotient
247 000B1E ; OVER >R sign of remainder
248 000B1E ; ABS >R DABS R> UM/MOD
249 000B1E ; SWAP R> ?NEGATE
250 000B1E ; SWAP R> ?NEGATE ;
251 000B1E ; Ref. dpANS-6 section 3.2.2.1.
252 000B1E HEADER SMSLASHREM,6,'SM/REM',DOCOLON
252.1 000000 PUBLIC SMSLASHREM
252.2 000B1E .... DW link
252.3 000B20 FF DB 0FFh ; not immediate
252.4 000B21 link SET $
252.5 000B21 06 DB 6
252.6 000B22 534D2F52454D DB 'SM/REM'
252.7 000B28 EVEN
252.8 000B28 IF 'DOCOLON'='DOCODE'
252.9 000B28 SMSLASHREM: DW $+2
252.10 000B28 ELSE
252.11 000B28 .... SMSLASHREM: DW DOCOLON
252.12 000B2A ENDIF
252.13 000B2A ENDM
253 000B2A ............* DW TWODUP,XORR,TOR,OVER,TOR
254 000B34 ............* DW ABBS,TOR,DABS,RFROM,UMSLASHMOD
255 000B3E ............* DW SWAP,RFROM,QNEGATE,SWAP,RFROM,QNEGATE
256 000B4A .... DW EXIT
257 000B4C
258 000B4C ;C FM/MOD d1 n1 -- n2 n3 floored signed
div'n
259 000B4C ; Ching-Tang Tseng
Mar 24 2012
260 000B4C ; DUP >R OVER OVER XOR >R
261 000B4C ; SM/REM
262 000B4C ; OVER R> 0< AND
263 000B4C ; IF SWAP R@ + SWAP 1 -
264 000B4C ; THEN R> DROP ;
265 000B4C ; 1 0 2 FM/MOD(OK) . . 0 1 ok
266 000B4C ; 7 0 9 FM/MOD(OK) . . 0 7 ok
267 000B4C ; Ref. dpANS-6 section 3.2.2.1.
268 000B4C HEADER FMSLASHMOD,6,'FM/MOD',DOCOLON
268.1 000000 PUBLIC FMSLASHMOD
268.2 000B4C .... DW link
268.3 000B4E FF DB 0FFh ; not immediate
268.4 000B4F link SET $
268.5 000B4F 06 DB 6
268.6 000B50 464D2F4D4F44 DB 'FM/MOD'
268.7 000B56 EVEN
268.8 000B56 IF 'DOCOLON'='DOCODE'
268.9 000B56 FMSLASHMOD: DW $+2
268.10 000B56 ELSE
268.11 000B56 .... FMSLASHMOD: DW DOCOLON
268.12 000B58 ENDIF
268.13 000B58 ENDM
269 000B58 ............* DW DUP,TOR,OVER,OVER,XORR,TOR
270 000B64 .... DW SMSLASHREM
271 000B66 ............* DW OVER,RFROM,ZEROLESS,ANDD,qbran
272 000B70 DEST FMMOD1
272.1 000B70 0C00 DW FMMOD1-$
272.2 000B72 ENDM
273 000B72 ............* DW SWAP,RFETCH,PLUS,SWAP,ONEMINUS
274 000B7C ............ FMMOD1: DW RFROM,DROP,EXIT
275 000B82
276 000B82 ;C * n1 n2 -- n3 signed multiply
277 000B82 ; M* DROP ;
278 000B82 HEADER STAR,1,'*',DOCOLON
278.1 000000 PUBLIC STAR
278.2 000B82 .... DW link
278.3 000B84 FF DB 0FFh ; not immediate
278.4 000B85 link SET $
278.5 000B85 01 DB 1
278.6 000B86 2A DB '*'
278.7 000B87 00 EVEN
278.8 000B88 IF 'DOCOLON'='DOCODE'
278.9 000B88 STAR: DW $+2
278.10 000B88 ELSE
278.11 000B88 .... STAR: DW DOCOLON
278.12 000B8A ENDIF
278.13 000B8A ENDM
279 000B8A ............ DW MSTAR,DROP,EXIT
280 000B90
281 000B90 ;C /MOD n1 n2 -- n3 n4 signed divide/rem'dr
282 000B90 ; >R S>D R> FM/MOD ;
283 000B90 HEADER SLASHMOD,4,'/MOD',DOCOLON
283.1 000000 PUBLIC SLASHMOD
283.2 000B90 .... DW link
283.3 000B92 FF DB 0FFh ; not immediate
283.4 000B93 link SET $
283.5 000B93 04 DB 4
283.6 000B94 2F4D4F44 DB '/MOD'
283.7 000B98 EVEN
283.8 000B98 IF 'DOCOLON'='DOCODE'
283.9 000B98 SLASHMOD: DW $+2
283.10 000B98 ELSE
283.11 000B98 .... SLASHMOD: DW DOCOLON
283.12 000B9A ENDIF
283.13 000B9A ENDM
284 000B9A ............* DW TOR,STOD,RFROM,FMSLASHMOD,EXIT
285 000BA4
286 000BA4 ;C / n1 n2 -- n3 signed divide
287 000BA4 ; /MOD nip ;
288 000BA4 HEADER SLASH,1,'/',DOCOLON
288.1 000000 PUBLIC SLASH
288.2 000BA4 .... DW link
288.3 000BA6 FF DB 0FFh ; not immediate
288.4 000BA7 link SET $
288.5 000BA7 01 DB 1
288.6 000BA8 2F DB '/'
288.7 000BA9 00 EVEN
288.8 000BAA IF 'DOCOLON'='DOCODE'
288.9 000BAA SLASH: DW $+2
288.10 000BAA ELSE
288.11 000BAA .... SLASH: DW DOCOLON
288.12 000BAC ENDIF
288.13 000BAC ENDM
289 000BAC ............ DW SLASHMOD,NIP,EXIT
290 000BB2
291 000BB2 ;C MOD n1 n2 -- n3 signed remainder
292 000BB2 ; /MOD DROP ;
293 000BB2 HEADER MODD,3,'MOD',DOCOLON
293.1 000000 PUBLIC MODD
293.2 000BB2 .... DW link
293.3 000BB4 FF DB 0FFh ; not immediate
293.4 000BB5 link SET $
293.5 000BB5 03 DB 3
293.6 000BB6 4D4F44 DB 'MOD'
293.7 000BB9 00 EVEN
293.8 000BBA IF 'DOCOLON'='DOCODE'
293.9 000BBA MODD: DW $+2
293.10 000BBA ELSE
293.11 000BBA .... MODD: DW DOCOLON
293.12 000BBC ENDIF
293.13 000BBC ENDM
294 000BBC ............ DW SLASHMOD,DROP,EXIT
295 000BC2
296 000BC2 ;C */MOD n1 n2 n3 -- n4 n5 n1*n2/n3,
rem"
297 000BC2 ; >R M* R> FM/MOD ;
298 000BC2 HEADER SSMOD,5,'*/MOD',DOCOLON
298.1 000000 PUBLIC SSMOD
298.2 000BC2 .... DW link
298.3 000BC4 FF DB 0FFh ; not immediate
298.4 000BC5 link SET $
298.5 000BC5 05 DB 5
298.6 000BC6 2A2F4D4F44 DB '*/MOD'
298.7 000BCB 00 EVEN
298.8 000BCC IF 'DOCOLON'='DOCODE'
298.9 000BCC SSMOD: DW $+2
298.10 000BCC ELSE
298.11 000BCC .... SSMOD: DW DOCOLON
298.12 000BCE ENDIF
298.13 000BCE ENDM
299 000BCE ............* DW TOR,MSTAR,RFROM,FMSLASHMOD,EXIT
300 000BD8
301 000BD8 ;C */ n1 n2 n3 -- n4 n1*n2/n3
302 000BD8 ; */MOD nip ;
303 000BD8 HEADER STARSLASH,2,'*/',DOCOLON
303.1 000000 PUBLIC STARSLASH
303.2 000BD8 .... DW link
303.3 000BDA FF DB 0FFh ; not immediate
303.4 000BDB link SET $
303.5 000BDB 02 DB 2
303.6 000BDC 2A2F DB '*/'
303.7 000BDE EVEN
303.8 000BDE IF 'DOCOLON'='DOCODE'
303.9 000BDE STARSLASH: DW $+2
303.10 000BDE ELSE
303.11 000BDE .... STARSLASH: DW DOCOLON
303.12 000BE0 ENDIF
303.13 000BE0 ENDM
304 000BE0 ............ DW SSMOD,NIP,EXIT
305 000BE6
306 000BE6 ;C MAX n1 n2 -- n3 signed maximum
307 000BE6 ; 2DUP < IF SWAP THEN DROP ;
308 000BE6 HEADER MAX,3,'MAX',DOCOLON
308.1 000000 PUBLIC MAX
308.2 000BE6 .... DW link
308.3 000BE8 FF DB 0FFh ; not immediate
308.4 000BE9 link SET $
308.5 000BE9 03 DB 3
308.6 000BEA 4D4158 DB 'MAX'
308.7 000BED 00 EVEN
308.8 000BEE IF 'DOCOLON'='DOCODE'
308.9 000BEE MAX: DW $+2
308.10 000BEE ELSE
308.11 000BEE .... MAX: DW DOCOLON
308.12 000BF0 ENDIF
308.13 000BF0 ENDM
309 000BF0 ............ DW TWODUP,LESS,qbran
310 000BF6 DEST MAX1
310.1 000BF6 0400 DW MAX1-$
310.2 000BF8 ENDM
311 000BF8 .... DW SWAP
312 000BFA ........ MAX1: DW DROP,EXIT
313 000BFE
314 000BFE ;C MIN n1 n2 -- n3 signed minimum
315 000BFE ; 2DUP > IF SWAP THEN DROP ;
316 000BFE HEADER MIN,3,'MIN',DOCOLON
316.1 000000 PUBLIC MIN
316.2 000BFE .... DW link
316.3 000C00 FF DB 0FFh ; not immediate
316.4 000C01 link SET $
316.5 000C01 03 DB 3
316.6 000C02 4D494E DB 'MIN'
316.7 000C05 00 EVEN
316.8 000C06 IF 'DOCOLON'='DOCODE'
316.9 000C06 MIN: DW $+2
316.10 000C06 ELSE
316.11 000C06 .... MIN: DW DOCOLON
316.12 000C08 ENDIF
316.13 000C08 ENDM
317 000C08 ............ DW TWODUP,GREATER,qbran
318 000C0E DEST MIN1
318.1 000C0E 0400 DW MIN1-$
318.2 000C10 ENDM
319 000C10 .... DW SWAP
320 000C12 ........ MIN1: DW DROP,EXIT
321 000C16
322 000C16 ; DOUBLE OPERATORS =============================
=
323 000C16
324 000C16 ;C 2@ a-addr -- x1 x2 fetch 2 cells
325 000C16 ; DUP CELL+ @ SWAP @ ;
326 000C16 ; the lower address will appear on top of
stack
327 000C16 HEADER TWOFETCH,2,'2@',DOCOLON
327.1 000000 PUBLIC TWOFETCH
327.2 000C16 .... DW link
327.3 000C18 FF DB 0FFh ; not immediate
327.4 000C19 link SET $
327.5 000C19 02 DB 2
327.6 000C1A 3240 DB '2@'
327.7 000C1C EVEN
327.8 000C1C IF 'DOCOLON'='DOCODE'
327.9 000C1C TWOFETCH: DW $+2
327.10 000C1C ELSE
327.11 000C1C .... TWOFETCH: DW DOCOLON
327.12 000C1E ENDIF
327.13 000C1E ENDM
328 000C1E ............* DW DUP,CELLPLUS,FETCH,SWAP,FETCH,EXIT
329 000C2A
330 000C2A ;C 2! x1 x2 a-addr -- store 2 cells
331 000C2A ; SWAP OVER ! CELL+ ! ;
332 000C2A ; the top of stack is stored at the lower
adrs
333 000C2A HEADER TWOSTORE,2,'2!',DOCOLON
333.1 000000 PUBLIC TWOSTORE
333.2 000C2A .... DW link
333.3 000C2C FF DB 0FFh ; not immediate
333.4 000C2D link SET $
333.5 000C2D 02 DB 2
333.6 000C2E 3221 DB '2!'
333.7 000C30 EVEN
333.8 000C30 IF 'DOCOLON'='DOCODE'
333.9 000C30 TWOSTORE: DW $+2
333.10 000C30 ELSE
333.11 000C30 .... TWOSTORE: DW DOCOLON
333.12 000C32 ENDIF
333.13 000C32 ENDM
334 000C32 ............* DW SWAP,OVER,STORE,CELLPLUS,STORE,EXIT
335 000C3E
336 000C3E ;C 2DROP x1 x2 -- drop 2 cells
337 000C3E ; DROP DROP ;
338 000C3E HEADER TWODROP,5,'2DROP',DOCOLON
338.1 000000 PUBLIC TWODROP
338.2 000C3E .... DW link
338.3 000C40 FF DB 0FFh ; not immediate
338.4 000C41 link SET $
338.5 000C41 05 DB 5
338.6 000C42 3244524F50 DB '2DROP'
338.7 000C47 00 EVEN
338.8 000C48 IF 'DOCOLON'='DOCODE'
338.9 000C48 TWODROP: DW $+2
338.10 000C48 ELSE
338.11 000C48 .... TWODROP: DW DOCOLON
338.12 000C4A ENDIF
338.13 000C4A ENDM
339 000C4A ............ DW DROP,DROP,EXIT
340 000C50
341 000C50 ;C 2DUP x1 x2 -- x1 x2 x1 x2 dup top 2
cells
342 000C50 ; OVER OVER ;
343 000C50 HEADER TWODUP,4,'2DUP',DOCOLON
343.1 000000 PUBLIC TWODUP
343.2 000C50 .... DW link
343.3 000C52 FF DB 0FFh ; not immediate
343.4 000C53 link SET $
343.5 000C53 04 DB 4
343.6 000C54 32445550 DB '2DUP'
343.7 000C58 EVEN
343.8 000C58 IF 'DOCOLON'='DOCODE'
343.9 000C58 TWODUP: DW $+2
343.10 000C58 ELSE
343.11 000C58 .... TWODUP: DW DOCOLON
343.12 000C5A ENDIF
343.13 000C5A ENDM
344 000C5A ............ DW OVER,OVER,EXIT
345 000C60
346 000C60 ;C 2SWAP x1 x2 x3 x4 -- x3 x4 x1 x2 per
diagram
347 000C60 ; ROT >R ROT R> ;
348 000C60 HEADER TWOSWAP,5,'2SWAP',DOCOLON
348.1 000000 PUBLIC TWOSWAP
348.2 000C60 .... DW link
348.3 000C62 FF DB 0FFh ; not immediate
348.4 000C63 link SET $
348.5 000C63 05 DB 5
348.6 000C64 3253574150 DB '2SWAP'
348.7 000C69 00 EVEN
348.8 000C6A IF 'DOCOLON'='DOCODE'
348.9 000C6A TWOSWAP: DW $+2
348.10 000C6A ELSE
348.11 000C6A .... TWOSWAP: DW DOCOLON
348.12 000C6C ENDIF
348.13 000C6C ENDM
349 000C6C ............* DW ROT,TOR,ROT,RFROM,EXIT
350 000C76
351 000C76 ;C 2OVER x1 x2 x3 x4 -- x1 x2 x3 x4 x1
x2
352 000C76 ; >R >R 2DUP R> R> 2SWAP ;
353 000C76 HEADER TWOOVER,5,'2OVER',DOCOLON
353.1 000000 PUBLIC TWOOVER
353.2 000C76 .... DW link
353.3 000C78 FF DB 0FFh ; not immediate
353.4 000C79 link SET $
353.5 000C79 05 DB 5
353.6 000C7A 324F564552 DB '2OVER'
353.7 000C7F 00 EVEN
353.8 000C80 IF 'DOCOLON'='DOCODE'
353.9 000C80 TWOOVER: DW $+2
353.10 000C80 ELSE
353.11 000C80 .... TWOOVER: DW DOCOLON
353.12 000C82 ENDIF
353.13 000C82 ENDM
354 000C82 ............* DW TOR,TOR,TWODUP,RFROM,RFROM
355 000C8C ........ DW TWOSWAP,EXIT
356 000C90
357 000C90 ; INPUT/OUTPUT =================================
=
358 000C90
359 000C90 ;C COUNT c-addr1 -- c-addr2 u counted->adr/le
n
360 000C90 ; DUP CHAR+ SWAP C@ ;
361 000C90 HEADER COUNT,5,'COUNT',DOCOLON
361.1 000000 PUBLIC COUNT
361.2 000C90 .... DW link
361.3 000C92 FF DB 0FFh ; not immediate
361.4 000C93 link SET $
361.5 000C93 05 DB 5
361.6 000C94 434F554E54 DB 'COUNT'
361.7 000C99 00 EVEN
361.8 000C9A IF 'DOCOLON'='DOCODE'
361.9 000C9A COUNT: DW $+2
361.10 000C9A ELSE
361.11 000C9A .... COUNT: DW DOCOLON
361.12 000C9C ENDIF
361.13 000C9C ENDM
362 000C9C ............* DW DUP,CHARPLUS,SWAP,CFETCH,EXIT
363 000CA6
364 000CA6 ;C CR -- output newline
365 000CA6 ; 0D EMIT 0A EMIT ;
366 000CA6 HEADER CR,2,'CR',DOCOLON
366.1 000000 PUBLIC CR
366.2 000CA6 .... DW link
366.3 000CA8 FF DB 0FFh ; not immediate
366.4 000CA9 link SET $
366.5 000CA9 02 DB 2
366.6 000CAA 4352 DB 'CR'
366.7 000CAC EVEN
366.8 000CAC IF 'DOCOLON'='DOCODE'
366.9 000CAC CR: DW $+2
366.10 000CAC ELSE
366.11 000CAC .... CR: DW DOCOLON
366.12 000CAE ENDIF
366.13 000CAE ENDM
367 000CAE ....0D00....* DW lit,0dh,EMIT,lit,0ah,EMIT,EXIT
368 000CBC
369 000CBC ;C SPACE -- output a space
370 000CBC ; BL EMIT ;
371 000CBC HEADER SPACE,5,'SPACE',DOCOLON
371.1 000000 PUBLIC SPACE
371.2 000CBC .... DW link
371.3 000CBE FF DB 0FFh ; not immediate
371.4 000CBF link SET $
371.5 000CBF 05 DB 5
371.6 000CC0 5350414345 DB 'SPACE'
371.7 000CC5 00 EVEN
371.8 000CC6 IF 'DOCOLON'='DOCODE'
371.9 000CC6 SPACE: DW $+2
371.10 000CC6 ELSE
371.11 000CC6 .... SPACE: DW DOCOLON
371.12 000CC8 ENDIF
371.13 000CC8 ENDM
372 000CC8 ............ DW BLANK,EMIT,EXIT
373 000CCE
374 000CCE ;C SPACES n -- output n spaces
375 000CCE ; BEGIN DUP WHILE SPACE 1- REPEAT DROP
;
376 000CCE HEADER SPACES,6,'SPACES',DOCOLON
376.1 000000 PUBLIC SPACES
376.2 000CCE .... DW link
376.3 000CD0 FF DB 0FFh ; not immediate
376.4 000CD1 link SET $
376.5 000CD1 06 DB 6
376.6 000CD2 535041434553 DB 'SPACES'
376.7 000CD8 EVEN
376.8 000CD8 IF 'DOCOLON'='DOCODE'
376.9 000CD8 SPACES: DW $+2
376.10 000CD8 ELSE
376.11 000CD8 .... SPACES: DW DOCOLON
376.12 000CDA ENDIF
376.13 000CDA ENDM
377 000CDA ........ SPCS1: DW DUP,qbran
378 000CDE DEST SPCS2
378.1 000CDE 0A00 DW SPCS2-$
378.2 000CE0 ENDM
379 000CE0 ............ DW SPACE,ONEMINUS,bran
380 000CE6 DEST SPCS1
380.1 000CE6 F4FF DW SPCS1-$
380.2 000CE8 ENDM
381 000CE8 ........ SPCS2: DW DROP,EXIT
382 000CEC
383 000CEC ;Z umin u1 u2 -- u unsigned minimum
384 000CEC ; 2DUP U> IF SWAP THEN DROP ;
385 000CEC HEADER UMIN,4,'UMIN',DOCOLON
385.1 000000 PUBLIC UMIN
385.2 000CEC .... DW link
385.3 000CEE FF DB 0FFh ; not immediate
385.4 000CEF link SET $
385.5 000CEF 04 DB 4
385.6 000CF0 554D494E DB 'UMIN'
385.7 000CF4 EVEN
385.8 000CF4 IF 'DOCOLON'='DOCODE'
385.9 000CF4 UMIN: DW $+2
385.10 000CF4 ELSE
385.11 000CF4 .... UMIN: DW DOCOLON
385.12 000CF6 ENDIF
385.13 000CF6 ENDM
386 000CF6 ............ DW TWODUP,UGREATER,qbran
387 000CFC DEST UMIN1
387.1 000CFC 0400 DW UMIN1-$
387.2 000CFE ENDM
388 000CFE .... DW SWAP
389 000D00 ........ UMIN1: DW DROP,EXIT
390 000D04
391 000D04 ;Z umax u1 u2 -- u unsigned maximum
392 000D04 ; 2DUP U< IF SWAP THEN DROP ;
393 000D04 HEADER UMAX,4,'UMAX',DOCOLON
393.1 000000 PUBLIC UMAX
393.2 000D04 .... DW link
393.3 000D06 FF DB 0FFh ; not immediate
393.4 000D07 link SET $
393.5 000D07 04 DB 4
393.6 000D08 554D4158 DB 'UMAX'
393.7 000D0C EVEN
393.8 000D0C IF 'DOCOLON'='DOCODE'
393.9 000D0C UMAX: DW $+2
393.10 000D0C ELSE
393.11 000D0C .... UMAX: DW DOCOLON
393.12 000D0E ENDIF
393.13 000D0E ENDM
394 000D0E ............ DW TWODUP,ULESS,qbran
395 000D14 DEST UMAX1
395.1 000D14 0400 DW UMAX1-$
395.2 000D16 ENDM
396 000D16 .... DW SWAP
397 000D18 ........ UMAX1: DW DROP,EXIT
398 000D1C
399 000D1C ;C ACCEPT c-addr +n -- +n' get line from
term'l
400 000D1C ; OVER + 1- OVER -- sa ea a
401 000D1C ; BEGIN KEY -- sa ea a c
402 000D1C ; DUP 0D <> WHILE
403 000D1C ; DUP EMIT -- sa ea a c
404 000D1C ; DUP 8 = IF DROP 1- >R OVER R>
UMAX
405 000D1C ; ELSE OVER C! 1+ OVER UMIN
406 000D1C ; THEN -- sa ea a
407 000D1C ; REPEAT -- sa ea a c
408 000D1C ; DROP NIP SWAP - ;
409 000D1C HEADER ACCEPT,6,'ACCEPT',DOCOLON
409.1 000000 PUBLIC ACCEPT
409.2 000D1C .... DW link
409.3 000D1E FF DB 0FFh ; not immediate
409.4 000D1F link SET $
409.5 000D1F 06 DB 6
409.6 000D20 414343455054 DB 'ACCEPT'
409.7 000D26 EVEN
409.8 000D26 IF 'DOCOLON'='DOCODE'
409.9 000D26 ACCEPT: DW $+2
409.10 000D26 ELSE
409.11 000D26 .... ACCEPT: DW DOCOLON
409.12 000D28 ENDIF
409.13 000D28 ENDM
410 000D28 ............* DW OVER,PLUS,ONEMINUS,OVER
411 000D30 ACC1: ; DW KEY,DUP,lit,0DH,NOTEQUAL,qbran
412 000D30 .... DW KEY
413 000D32 ........0D00* DW DUP,lit,0DH,NOTEQUAL ; ( -- c f )
CR
414 000D3A ; DW OVER,lit,0AH,NOTEQUAL ; ( -- c f f )
LF
415 000D3A ; DW ANDD
416 000D3A .... DW qbran
417 000D3C DEST ACC5
417.1 000D3C 3800 DW ACC5-$
417.2 000D3E ENDM
418 000D3E ........ DW DUP,EMIT
419 000D42 ; DW DUP,STORELEDS ; testing
420 000D42 ........0800* DW DUP,lit,8,EQUAL,qbran ;mk BS
received?
421 000D4C DEST ACC3
421.1 000D4C 1A00 DW ACC3-$
421.2 000D4E ENDM
422 000D4E ............* DW DROP,ONEMINUS,TOR,OVER,RFROM,UMAX ;mk
backspace handling
423 000D5A ........0800* DW SPACE,lit,8,EMIT ;mk $08 == BS (for
tera term and
hyterterminal)
424 000D62 .... DW bran
425 000D64 DEST ACC4
425.1 000D64 0C00 DW ACC4-$
425.2 000D66 ENDM
426 000D66 ............*ACC3: DW OVER,CSTORE,ONEPLUS,OVER,UMIN
427 000D70 .... ACC4: DW bran
428 000D72 DEST ACC1
428.1 000D72 BEFF DW ACC1-$
428.2 000D74 ENDM
429 000D74 ............*ACC5: DW DROP,NIP,SWAP,MINUS,EXIT
430 000D7E
431 000D7E ;C TYPE c-addr +n -- type line to
term'l
432 000D7E ; ?DUP IF
433 000D7E ; OVER + SWAP DO I C@ EMIT LOOP
434 000D7E ; ELSE DROP THEN ;
435 000D7E HEADER TYP,4,'TYPE',DOCOLON
435.1 000000 PUBLIC TYP
435.2 000D7E .... DW link
435.3 000D80 FF DB 0FFh ; not immediate
435.4 000D81 link SET $
435.5 000D81 04 DB 4
435.6 000D82 54595045 DB 'TYPE'
435.7 000D86 EVEN
435.8 000D86 IF 'DOCOLON'='DOCODE'
435.9 000D86 TYP: DW $+2
435.10 000D86 ELSE
435.11 000D86 .... TYP: DW DOCOLON
435.12 000D88 ENDIF
435.13 000D88 ENDM
436 000D88 ........ DW QDUP,qbran
437 000D8C DEST TYP4
437.1 000D8C 1800 DW TYP4-$
437.2 000D8E ENDM
438 000D8E ............* DW OVER,PLUS,SWAP,xdo
439 000D96 ............*TYP3: DW II,CFETCH,EMIT,xloop
440 000D9E DEST TYP3
440.1 000D9E F8FF DW TYP3-$
440.2 000DA0 ENDM
441 000DA0 .... DW bran
442 000DA2 DEST TYP5
442.1 000DA2 0400 DW TYP5-$
442.2 000DA4 ENDM
443 000DA4 .... TYP4: DW DROP
444 000DA6 .... TYP5: DW EXIT
445 000DA8
446 000DA8
447 000DA8 ; HARVARD MODEL EXTENSIONS (split Code &
Data)
448 000DA8
449 000DA8 ;Z ICOUNT c-addr1 -- c-addr2 u counted->adr/le
n
450 000DA8 ; DUP CHAR+ SWAP IC@ ; from Code
space
451 000DA8 HEADER ICOUNT,6,'ICOUNT',DOCOLON
451.1 000000 PUBLIC ICOUNT
451.2 000DA8 .... DW link
451.3 000DAA FF DB 0FFh ; not immediate
451.4 000DAB link SET $
451.5 000DAB 06 DB 6
451.6 000DAC 49434F554E54 DB 'ICOUNT'
451.7 000DB2 EVEN
451.8 000DB2 IF 'DOCOLON'='DOCODE'
451.9 000DB2 ICOUNT: DW $+2
451.10 000DB2 ELSE
451.11 000DB2 .... ICOUNT: DW DOCOLON
451.12 000DB4 ENDIF
451.13 000DB4 ENDM
452 000DB4 ............* DW DUP,CHARPLUS,SWAP,ICFETCH,EXIT
453 000DBE
454 000DBE ;Z ITYPE c-addr +n -- type line to
term'l
455 000DBE ; ?DUP IF from Code
space
456 000DBE ; OVER + SWAP DO I IC@ EMIT LOOP
457 000DBE ; ELSE DROP THEN ;
458 000DBE HEADER ITYPE,5,'ITYPE',DOCOLON
458.1 000000 PUBLIC ITYPE
458.2 000DBE .... DW link
458.3 000DC0 FF DB 0FFh ; not immediate
458.4 000DC1 link SET $
458.5 000DC1 05 DB 5
458.6 000DC2 4954595045 DB 'ITYPE'
458.7 000DC7 00 EVEN
458.8 000DC8 IF 'DOCOLON'='DOCODE'
458.9 000DC8 ITYPE: DW $+2
458.10 000DC8 ELSE
458.11 000DC8 .... ITYPE: DW DOCOLON
458.12 000DCA ENDIF
458.13 000DCA ENDM
459 000DCA ........ DW QDUP,qbran
460 000DCE DEST ITYP4
460.1 000DCE 1800 DW ITYP4-$
460.2 000DD0 ENDM
461 000DD0 ............* DW OVER,PLUS,SWAP,xdo
462 000DD8 ............*ITYP3: DW II,ICFETCH,EMIT,xloop
463 000DE0 DEST ITYP3
463.1 000DE0 F8FF DW ITYP3-$
463.2 000DE2 ENDM
464 000DE2 .... DW bran
465 000DE4 DEST ITYP5
465.1 000DE4 0400 DW ITYP5-$
465.2 000DE6 ENDM
466 000DE6 .... ITYP4: DW DROP
467 000DE8 .... ITYP5: DW EXIT
468 000DEA
469 000DEA ;Z (IS") -- c-addr u run-time code for
S"
470 000DEA ; R> ICOUNT 2DUP + ALIGNED >R ;
471 000DEA ; Harvard model, for string stored in Code
space
472 000DEA ; e.g. as used by ."
473 000DEA HEADER XISQUOTE,5,'(IS")',DOCOLON
473.1 000000 PUBLIC XISQUOTE
473.2 000DEA .... DW link
473.3 000DEC FF DB 0FFh ; not immediate
473.4 000DED link SET $
473.5 000DED 05 DB 5
473.6 000DEE 2849532229 DB '(IS")'
473.7 000DF3 00 EVEN
473.8 000DF4 IF 'DOCOLON'='DOCODE'
473.9 000DF4 XISQUOTE: DW $+2
473.10 000DF4 ELSE
473.11 000DF4 .... XISQUOTE: DW DOCOLON
473.12 000DF6 ENDIF
473.13 000DF6 ENDM
474 000DF6 ............* DW RFROM,ICOUNT,TWODUP,PLUS,ALIGNED,TOR
475 000E02 .... DW EXIT
476 000E04
477 000E04 ;Z (S") -- c-addr u run-time code for
S"
478 000E04 ; R@ I@ get Data
address
479 000E04 ; R> CELL+ DUP IC@ CHAR+ -- Dadr Radr+2
n+1
480 000E04 ; 2DUP + ALIGNED >R -- Dadr Iadr
n+1
481 000E04 ; >R OVER R> I->D -- Dadr
482 000E04 ; COUNT ;
483 000E04 ; Harvard model, for string stored in Code
space
484 000E04 ; which is copied to Data space.
485 000E04 HEADER XSQUOTE,4,'(S")',DOCOLON
485.1 000000 PUBLIC XSQUOTE
485.2 000E04 .... DW link
485.3 000E06 FF DB 0FFh ; not immediate
485.4 000E07 link SET $
485.5 000E07 04 DB 4
485.6 000E08 28532229 DB '(S")'
485.7 000E0C EVEN
485.8 000E0C IF 'DOCOLON'='DOCODE'
485.9 000E0C XSQUOTE: DW $+2
485.10 000E0C ELSE
485.11 000E0C .... XSQUOTE: DW DOCOLON
485.12 000E0E ENDIF
485.13 000E0E ENDM
486 000E0E ........ DW RFETCH,IFETCH
487 000E12 ............* DW RFROM,CELLPLUS,DUP,ICFETCH,CHARPLUS
488 000E1C ............* DW TWODUP,PLUS,ALIGNED,TOR
489 000E24 ............* DW TOR,OVER,RFROM,ITOD,COUNT,EXIT
490 000E30
491 000E30 ;C IS" -- compile in-line
string
492 000E30 ; COMPILE (IS") [ HEX ]
493 000E30 ; 22 IWORD
494 000E30 ; IC@ 1+ ALIGNED IALLOT ; IMMEDIATE
495 000E30 ; Harvard model: string is stored in Code
space
496 000E30 IMMED ISQUOTE,3,'IS"',DOCOLON
496.1 000000 PUBLIC ISQUOTE
496.2 000E30 .... DW link
496.3 000E32 FE DB 0FEh // ; immediate
(LSB=0)
496.4 000E33 link SET $
496.5 000E33 03 DB 3
496.6 000E34 495322 DB 'IS"'
496.7 000E37 00 EVEN
496.8 000E38 IF 'DOCOLON'='DOCODE'
496.9 000E38 ISQUOTE: DW $+2
496.10 000E38 ELSE
496.11 000E38 .... ISQUOTE: DW DOCOLON
496.12 000E3A ENDIF
496.13 000E3A ENDM
497 000E3A ............ DW lit,XISQUOTE,COMMAXT
498 000E40 ....2200.... DW lit,22H,IWORD
499 000E46 ............* DW ICFETCH,ONEPLUS,ALIGNED,IALLOT,EXIT
500 000E50
501 000E50 ;C S" -- compile in-line
string
502 000E50 ; COMPILE (S") [ HEX ]
503 000E50 ; HERE I, data address
504 000E50 ; 22 IWORD
505 000E50 ; IC@ 1+ ALIGNED
506 000E50 ; DUP ALLOT IALLOT ; IMMEDIATE
507 000E50 ; Harvard model: string is stored in Code
space
508 000E50 IMMED SQUOTE,2,'S"',DOCOLON
508.1 000000 PUBLIC SQUOTE
508.2 000E50 .... DW link
508.3 000E52 FE DB 0FEh // ; immediate
(LSB=0)
508.4 000E53 link SET $
508.5 000E53 02 DB 2
508.6 000E54 5322 DB 'S"'
508.7 000E56 EVEN
508.8 000E56 IF 'DOCOLON'='DOCODE'
508.9 000E56 SQUOTE: DW $+2
508.10 000E56 ELSE
508.11 000E56 .... SQUOTE: DW DOCOLON
508.12 000E58 ENDIF
508.13 000E58 ENDM
509 000E58 ............ DW lit,XSQUOTE,COMMAXT
510 000E5E ............* DW HERE,ICOMMA,lit,22H,IWORD
511 000E68 ............ DW ICFETCH,ONEPLUS,ALIGNED
512 000E6E ............* DW DUP,ALLOT,IALLOT,EXIT
513 000E76
514 000E76 ;C ." -- compile string to
print
515 000E76 ; POSTPONE IS" POSTPONE ITYPE ; IMMEDIATE
516 000E76 IMMED DOTQUOTE,2,'."',DOCOLON
516.1 000000 PUBLIC DOTQUOTE
516.2 000E76 .... DW link
516.3 000E78 FE DB 0FEh // ; immediate
(LSB=0)
516.4 000E79 link SET $
516.5 000E79 02 DB 2
516.6 000E7A 2E22 DB '."'
516.7 000E7C EVEN
516.8 000E7C IF 'DOCOLON'='DOCODE'
516.9 000E7C DOTQUOTE: DW $+2
516.10 000E7C ELSE
516.11 000E7C .... DOTQUOTE: DW DOCOLON
516.12 000E7E ENDIF
516.13 000E7E ENDM
517 000E7E .... DW ISQUOTE
518 000E80 ............ DW lit,ITYPE,COMMAXT
519 000E86 .... DW EXIT
520 000E88
521 000E88 ;Z IWORD c -- c-addr WORD to Code
space
522 000E88 ; WORD
523 000E88 ; IHERE TUCK OVER C@ CHAR+ D->I ;
524 000E88 HEADER IWORD,5,'IWORD',DOCOLON
524.1 000000 PUBLIC IWORD
524.2 000E88 .... DW link
524.3 000E8A FF DB 0FFh ; not immediate
524.4 000E8B link SET $
524.5 000E8B 05 DB 5
524.6 000E8C 49574F5244 DB 'IWORD'
524.7 000E91 00 EVEN
524.8 000E92 IF 'DOCOLON'='DOCODE'
524.9 000E92 IWORD: DW $+2
524.10 000E92 ELSE
524.11 000E92 .... IWORD: DW DOCOLON
524.12 000E94 ENDIF
524.13 000E94 ENDM
525 000E94 .... DW WORDD
526 000E96 ............*IWORD1: DW IHERE,TUCK,OVER,CFETCH
527 000E9E ............ DW CHARPLUS,DTOI,EXIT
528 000EA4
529 000EA4 ;Z IWORDC c -- c-addr maybe capitalize
WORD to Code space
530 000EA4 ; WORD CAPITALIZE
531 000EA4 ; IHERE TUCK OVER C@ CHAR+ D->I ;
532 000EA4 ; HEADER IWORDC,6,'IWORDC',DOCOLON
533 000EA4 HEADLESS IWORDC, DOCOLON
533.1 000000 PUBLIC IWORDC
533.2 000EA4 IF 'DOCOLON'='DOCODE'
533.3 000EA4 IWORDC: DW $+2
533.4 000EA4 ELSE
533.5 000EA4 .... IWORDC: DW DOCOLON
533.6 000EA6 ENDIF
533.7 000EA6 ENDM
534 000EA6 ........ DW WORDD, CAPITALIZE
535 000EAA .... DW bran
536 000EAC DEST IWORD1
536.1 000EAC EAFF DW IWORD1-$
536.2 000EAE ENDM
537 000EAE
538 000EAE ; SEPARATE HEADER EXTENSIONS ARE NOT USED
539 000EAE #define HCOUNT ICOUNT
540 000EAE #define HTYPE ITYPE
541 000EAE #define HWORD IWORDC
542 000EAE
543 000EAE ; NUMERIC OUTPUT ===============================
=
544 000EAE ; Numeric conversion is done l.s.digit first,
so
545 000EAE ; the output buffer is built backwards in
memory.
546 000EAE
547 000EAE ; Some double-precision arithmetic operators
are
548 000EAE ; needed to implement ANSI numeric conversion.
549 000EAE
550 000EAE ;Z UD/MOD ud1 u2 -- u3 ud4 32/16->32
divide
551 000EAE ; >R 0 R@ UM/MOD ROT ROT R> UM/MOD ROT
;
552 000EAE HEADER UDSLASHMOD,6,'UD/MOD',DOCOLON
552.1 000000 PUBLIC UDSLASHMOD
552.2 000EAE .... DW link
552.3 000EB0 FF DB 0FFh ; not immediate
552.4 000EB1 link SET $
552.5 000EB1 06 DB 6
552.6 000EB2 55442F4D4F44 DB 'UD/MOD'
552.7 000EB8 EVEN
552.8 000EB8 IF 'DOCOLON'='DOCODE'
552.9 000EB8 UDSLASHMOD: DW $+2
552.10 000EB8 ELSE
552.11 000EB8 .... UDSLASHMOD: DW DOCOLON
552.12 000EBA ENDIF
552.13 000EBA ENDM
553 000EBA ........0000* DW TOR,lit,0,RFETCH,UMSLASHMOD,ROT,ROT
554 000EC8 ............* DW RFROM,UMSLASHMOD,ROT,EXIT
555 000ED0
556 000ED0 ;Z UD* ud1 d2 -- ud3 32*16->32
multiply
557 000ED0 ; DUP >R UM* DROP SWAP R> UM* ROT +
;
558 000ED0 HEADER UDSTAR,3,'UD*',DOCOLON
558.1 000000 PUBLIC UDSTAR
558.2 000ED0 .... DW link
558.3 000ED2 FF DB 0FFh ; not immediate
558.4 000ED3 link SET $
558.5 000ED3 03 DB 3
558.6 000ED4 55442A DB 'UD*'
558.7 000ED7 00 EVEN
558.8 000ED8 IF 'DOCOLON'='DOCODE'
558.9 000ED8 UDSTAR: DW $+2
558.10 000ED8 ELSE
558.11 000ED8 .... UDSTAR: DW DOCOLON
558.12 000EDA ENDIF
558.13 000EDA ENDM
559 000EDA ............* DW DUP,TOR,UMSTAR,DROP
560 000EE2 ............* DW SWAP,RFROM,UMSTAR,ROT,PLUS,EXIT
561 000EEE
562 000EEE ;C HOLD char -- add char to output
string
563 000EEE ; -1 HP +! HP @ C! ;
564 000EEE HEADER HOLD,4,'HOLD',DOCOLON
564.1 000000 PUBLIC HOLD
564.2 000EEE .... DW link
564.3 000EF0 FF DB 0FFh ; not immediate
564.4 000EF1 link SET $
564.5 000EF1 04 DB 4
564.6 000EF2 484F4C44 DB 'HOLD'
564.7 000EF6 EVEN
564.8 000EF6 IF 'DOCOLON'='DOCODE'
564.9 000EF6 HOLD: DW $+2
564.10 000EF6 ELSE
564.11 000EF6 .... HOLD: DW DOCOLON
564.12 000EF8 ENDIF
564.13 000EF8 ENDM
565 000EF8 ....FFFF....* DW lit,-1,HP,PLUSSTORE
566 000F00 ............* DW HP,FETCH,CSTORE,EXIT
567 000F08
568 000F08 ;C <# -- begin numeric conversion
569 000F08 ; PAD HP ! ; (initialize Hold
Pointer)
570 000F08 HEADER LESSNUM,2,'<#',DOCOLON
570.1 000000 PUBLIC LESSNUM
570.2 000F08 .... DW link
570.3 000F0A FF DB 0FFh ; not immediate
570.4 000F0B link SET $
570.5 000F0B 02 DB 2
570.6 000F0C 3C23 DB '<#'
570.7 000F0E EVEN
570.8 000F0E IF 'DOCOLON'='DOCODE'
570.9 000F0E LESSNUM: DW $+2
570.10 000F0E ELSE
570.11 000F0E .... LESSNUM: DW DOCOLON
570.12 000F10 ENDIF
570.13 000F10 ENDM
571 000F10 ............* DW PAD,HP,STORE,EXIT
572 000F18
573 000F18 ;Z >digit n -- c convert to 0..9A..Z
574 000F18 ; [ HEX ] DUP 9 > 7 AND + 30 + ;
575 000F18 HEADER TODIGIT,6,'>DIGIT',DOCOLON
575.1 000000 PUBLIC TODIGIT
575.2 000F18 .... DW link
575.3 000F1A FF DB 0FFh ; not immediate
575.4 000F1B link SET $
575.5 000F1B 06 DB 6
575.6 000F1C 3E4449474954 DB '>DIGIT'
575.7 000F22 EVEN
575.8 000F22 IF 'DOCOLON'='DOCODE'
575.9 000F22 TODIGIT: DW $+2
575.10 000F22 ELSE
575.11 000F22 .... TODIGIT: DW DOCOLON
575.12 000F24 ENDIF
575.13 000F24 ENDM
576 000F24 ........0900* DW DUP,lit,9,GREATER,lit,7,ANDD,PLUS
577 000F34 ....3000....* DW lit,30H,PLUS,EXIT
578 000F3C
579 000F3C ;C # ud1 -- ud2 convert 1 digit of
output
580 000F3C ; BASE @ UD/MOD ROT >digit HOLD ;
581 000F3C HEADER NUM,1,'#',DOCOLON
581.1 000000 PUBLIC NUM
581.2 000F3C .... DW link
581.3 000F3E FF DB 0FFh ; not immediate
581.4 000F3F link SET $
581.5 000F3F 01 DB 1
581.6 000F40 23 DB '#'
581.7 000F41 00 EVEN
581.8 000F42 IF 'DOCOLON'='DOCODE'
581.9 000F42 NUM: DW $+2
581.10 000F42 ELSE
581.11 000F42 .... NUM: DW DOCOLON
581.12 000F44 ENDIF
581.13 000F44 ENDM
582 000F44 ............* DW BASE,FETCH,UDSLASHMOD,ROT,TODIGIT
583 000F4E ........ DW HOLD,EXIT
584 000F52
585 000F52 ;C #S ud1 -- ud2 convert remaining
digits
586 000F52 ; BEGIN # 2DUP OR 0= UNTIL ;
587 000F52 HEADER NUMS,2,'#S',DOCOLON
587.1 000000 PUBLIC NUMS
587.2 000F52 .... DW link
587.3 000F54 FF DB 0FFh ; not immediate
587.4 000F55 link SET $
587.5 000F55 02 DB 2
587.6 000F56 2353 DB '#S'
587.7 000F58 EVEN
587.8 000F58 IF 'DOCOLON'='DOCODE'
587.9 000F58 NUMS: DW $+2
587.10 000F58 ELSE
587.11 000F58 .... NUMS: DW DOCOLON
587.12 000F5A ENDIF
587.13 000F5A ENDM
588 000F5A ............*NUMS1: DW NUM,TWODUP,ORR,ZEROEQUAL,qbran
589 000F64 DEST NUMS1
589.1 000F64 F6FF DW NUMS1-$
589.2 000F66 ENDM
590 000F66 .... DW EXIT
591 000F68
592 000F68 ;C #> ud1 -- c-addr u end conv., get
string
593 000F68 ; 2DROP HP @ PAD OVER - ;
594 000F68 HEADER NUMGREATER,2,'#>',DOCOLON
594.1 000000 PUBLIC NUMGREATER
594.2 000F68 .... DW link
594.3 000F6A FF DB 0FFh ; not immediate
594.4 000F6B link SET $
594.5 000F6B 02 DB 2
594.6 000F6C 233E DB '#>'
594.7 000F6E EVEN
594.8 000F6E IF 'DOCOLON'='DOCODE'
594.9 000F6E NUMGREATER: DW $+2
594.10 000F6E ELSE
594.11 000F6E .... NUMGREATER: DW DOCOLON
594.12 000F70 ENDIF
594.13 000F70 ENDM
595 000F70 ............* DW TWODROP,HP,FETCH,PAD,OVER,MINUS,EXIT
596 000F7E
597 000F7E ;C SIGN n -- add minus sign if
n<0
598 000F7E ; 0< IF 2D HOLD THEN ;
599 000F7E HEADER SIGN,4,'SIGN',DOCOLON
599.1 000000 PUBLIC SIGN
599.2 000F7E .... DW link
599.3 000F80 FF DB 0FFh ; not immediate
599.4 000F81 link SET $
599.5 000F81 04 DB 4
599.6 000F82 5349474E DB 'SIGN'
599.7 000F86 EVEN
599.8 000F86 IF 'DOCOLON'='DOCODE'
599.9 000F86 SIGN: DW $+2
599.10 000F86 ELSE
599.11 000F86 .... SIGN: DW DOCOLON
599.12 000F88 ENDIF
599.13 000F88 ENDM
600 000F88 ........ DW ZEROLESS,qbran
601 000F8C DEST SIGN1
601.1 000F8C 0800 DW SIGN1-$
601.2 000F8E ENDM
602 000F8E ....2D00.... DW lit,2DH,HOLD
603 000F94 .... SIGN1: DW EXIT
604 000F96
605 000F96 ;C U. u -- display u unsigned
606 000F96 ; <# 0 #S #> TYPE SPACE ;
607 000F96 HEADER UDOT,2,'U.',DOCOLON
607.1 000000 PUBLIC UDOT
607.2 000F96 .... DW link
607.3 000F98 FF DB 0FFh ; not immediate
607.4 000F99 link SET $
607.5 000F99 02 DB 2
607.6 000F9A 552E DB 'U.'
607.7 000F9C EVEN
607.8 000F9C IF 'DOCOLON'='DOCODE'
607.9 000F9C UDOT: DW $+2
607.10 000F9C ELSE
607.11 000F9C .... UDOT: DW DOCOLON
607.12 000F9E ENDIF
607.13 000F9E ENDM
608 000F9E ........0000* DW LESSNUM,lit,0,NUMS,NUMGREATER,TYP
609 000FAA ........ DW SPACE,EXIT
610 000FAE
611 000FAE ;C . n -- display n signed
612 000FAE ; <# DUP ABS 0 #S ROT SIGN #> TYPE SPACE
;
613 000FAE HEADER DOT,1,'.',DOCOLON
613.1 000000 PUBLIC DOT
613.2 000FAE .... DW link
613.3 000FB0 FF DB 0FFh ; not immediate
613.4 000FB1 link SET $
613.5 000FB1 01 DB 1
613.6 000FB2 2E DB '.'
613.7 000FB3 00 EVEN
613.8 000FB4 IF 'DOCOLON'='DOCODE'
613.9 000FB4 DOT: DW $+2
613.10 000FB4 ELSE
613.11 000FB4 .... DOT: DW DOCOLON
613.12 000FB6 ENDIF
613.13 000FB6 ENDM
614 000FB6 ............* DW LESSNUM,DUP,ABBS,lit,0,NUMS
615 000FC2 ............* DW ROT,SIGN,NUMGREATER,TYP,SPACE,EXIT
616 000FCE
617 000FCE ;C DECIMAL -- set number base to
decimal
618 000FCE ; 10 BASE ! ;
619 000FCE HEADER DECIMAL,7,'DECIMAL',DOCOLON
619.1 000000 PUBLIC DECIMAL
619.2 000FCE .... DW link
619.3 000FD0 FF DB 0FFh ; not immediate
619.4 000FD1 link SET $
619.5 000FD1 07 DB 7
619.6 000FD2 444543494D41* DB 'DECIMAL'
619.7 000FD9 00 EVEN
619.8 000FDA IF 'DOCOLON'='DOCODE'
619.9 000FDA DECIMAL: DW $+2
619.10 000FDA ELSE
619.11 000FDA .... DECIMAL: DW DOCOLON
619.12 000FDC ENDIF
619.13 000FDC ENDM
620 000FDC ....0A00....* DW lit,10,BASE,STORE,EXIT
621 000FE6
622 000FE6 ;X HEX -- set number base to
hex
623 000FE6 ; 16 BASE ! ;
624 000FE6 HEADER HEX,3,'HEX',DOCOLON
624.1 000000 PUBLIC HEX
624.2 000FE6 .... DW link
624.3 000FE8 FF DB 0FFh ; not immediate
624.4 000FE9 link SET $
624.5 000FE9 03 DB 3
624.6 000FEA 484558 DB 'HEX'
624.7 000FED 00 EVEN
624.8 000FEE IF 'DOCOLON'='DOCODE'
624.9 000FEE HEX: DW $+2
624.10 000FEE ELSE
624.11 000FEE .... HEX: DW DOCOLON
624.12 000FF0 ENDIF
624.13 000FF0 ENDM
625 000FF0 ....1000....* DW lit,16,BASE,STORE,EXIT
626 000FFA
627 000FFA ; DICTIONARY MANAGEMENT ========================
=
628 000FFA
629 000FFA ;C HERE -- addr returns dictionary
ptr
630 000FFA ; DP @ ;
631 000FFA HEADER HERE,4,'HERE',DOCOLON
631.1 000000 PUBLIC HERE
631.2 000FFA .... DW link
631.3 000FFC FF DB 0FFh ; not immediate
631.4 000FFD link SET $
631.5 000FFD 04 DB 4
631.6 000FFE 48455245 DB 'HERE'
631.7 001002 EVEN
631.8 001002 IF 'DOCOLON'='DOCODE'
631.9 001002 HERE: DW $+2
631.10 001002 ELSE
631.11 001002 .... HERE: DW DOCOLON
631.12 001004 ENDIF
631.13 001004 ENDM
632 001004 ............ DW DDP,FETCH,EXIT
633 00100A
634 00100A ;C ALLOT n -- allocate n bytes in
dict
635 00100A ; DP +! ;
636 00100A HEADER ALLOT,5,'ALLOT',DOCOLON
636.1 000000 PUBLIC ALLOT
636.2 00100A .... DW link
636.3 00100C FF DB 0FFh ; not immediate
636.4 00100D link SET $
636.5 00100D 05 DB 5
636.6 00100E 414C4C4F54 DB 'ALLOT'
636.7 001013 00 EVEN
636.8 001014 IF 'DOCOLON'='DOCODE'
636.9 001014 ALLOT: DW $+2
636.10 001014 ELSE
636.11 001014 .... ALLOT: DW DOCOLON
636.12 001016 ENDIF
636.13 001016 ENDM
637 001016 ............ DW DDP,PLUSSTORE,EXIT
638 00101C
639 00101C ;C , x -- append cell to dict
640 00101C ; HERE ! 1 CELLS ALLOT ;
641 00101C HEADER COMMA,1,',',DOCOLON
641.1 000000 PUBLIC COMMA
641.2 00101C .... DW link
641.3 00101E FF DB 0FFh ; not immediate
641.4 00101F link SET $
641.5 00101F 01 DB 1
641.6 001020 2C DB ','
641.7 001021 00 EVEN
641.8 001022 IF 'DOCOLON'='DOCODE'
641.9 001022 COMMA: DW $+2
641.10 001022 ELSE
641.11 001022 .... COMMA: DW DOCOLON
641.12 001024 ENDIF
641.13 001024 ENDM
642 001024 ............* DW HERE,STORE,lit,1,CELLS,ALLOT,EXIT
643 001032
644 001032 ;C C, char -- append char to dict
645 001032 ; HERE C! 1 CHARS ALLOT ;
646 001032 HEADER CCOMMA,2,'C,',DOCOLON
646.1 000000 PUBLIC CCOMMA
646.2 001032 .... DW link
646.3 001034 FF DB 0FFh ; not immediate
646.4 001035 link SET $
646.5 001035 02 DB 2
646.6 001036 432C DB 'C,'
646.7 001038 EVEN
646.8 001038 IF 'DOCOLON'='DOCODE'
646.9 001038 CCOMMA: DW $+2
646.10 001038 ELSE
646.11 001038 .... CCOMMA: DW DOCOLON
646.12 00103A ENDIF
646.13 00103A ENDM
647 00103A ............* DW HERE,CSTORE,lit,1,CHARS,ALLOT,EXIT
648 001048
649 001048 ; The following additional words support
the
650 001048 ; "Harvard" model, with separate address
spaces
651 001048 ; for Instructions (Code) and Data. ANSI
652 001048 ; requires DP to manage the Data space, so
a
653 001048 ; separate Instruction Dictionary Pointer,
IDP,
654 001048 ; is added to manage the Code space. Also
added:
655 001048 ; I@ IC@ I! IC! I->D D->I (in the primitives
)
656 001048 ; ITYPE ICOUNT IWORD (above)
657 001048 ; IHERE IALLOT I, IC, (below)
658 001048 ; It should be possible to convert the
Harvard
659 001048 ; implementation to a combined-code-and-data
660 001048 ; system, by equating these words to their
661 001048 ; Data-space counterparts.
662 001048
663 001048 ;C IHERE -- addr returns Code dictionary
ptr
664 001048 ; IDP @ ;
665 001048 HEADER IHERE,5,'IHERE',DOCOLON
665.1 000000 PUBLIC IHERE
665.2 001048 .... DW link
665.3 00104A FF DB 0FFh ; not immediate
665.4 00104B link SET $
665.5 00104B 05 DB 5
665.6 00104C 4948455245 DB 'IHERE'
665.7 001051 00 EVEN
665.8 001052 IF 'DOCOLON'='DOCODE'
665.9 001052 IHERE: DW $+2
665.10 001052 ELSE
665.11 001052 .... IHERE: DW DOCOLON
665.12 001054 ENDIF
665.13 001054 ENDM
666 001054 ............ DW IDP,FETCH,EXIT
667 00105A
668 00105A ;C IALLOT n -- allocate n bytes in Code
dict
669 00105A ; IDP +! ;
670 00105A HEADER IALLOT,6,'IALLOT',DOCOLON
670.1 000000 PUBLIC IALLOT
670.2 00105A .... DW link
670.3 00105C FF DB 0FFh ; not immediate
670.4 00105D link SET $
670.5 00105D 06 DB 6
670.6 00105E 49414C4C4F54 DB 'IALLOT'
670.7 001064 EVEN
670.8 001064 IF 'DOCOLON'='DOCODE'
670.9 001064 IALLOT: DW $+2
670.10 001064 ELSE
670.11 001064 .... IALLOT: DW DOCOLON
670.12 001066 ENDIF
670.13 001066 ENDM
671 001066 ............ DW IDP,PLUSSTORE,EXIT
672 00106C
673 00106C ;C I, x -- append cell to Code
dict
674 00106C ; IHERE I! 1 CELLS IALLOT ;
675 00106C HEADER ICOMMA,2,'I,',DOCOLON
675.1 000000 PUBLIC ICOMMA
675.2 00106C .... DW link
675.3 00106E FF DB 0FFh ; not immediate
675.4 00106F link SET $
675.5 00106F 02 DB 2
675.6 001070 492C DB 'I,'
675.7 001072 EVEN
675.8 001072 IF 'DOCOLON'='DOCODE'
675.9 001072 ICOMMA: DW $+2
675.10 001072 ELSE
675.11 001072 .... ICOMMA: DW DOCOLON
675.12 001074 ENDIF
675.13 001074 ENDM
676 001074 ............* DW IHERE,ISTORE,lit,1,CELLS,IALLOT,EXIT
677 001082
678 001082 ;C IC, char -- append char to Code
dict
679 001082 ; IHERE IC! 1 CHARS IALLOT ;
680 001082 HEADER ICCOMMA,3,'IC,',DOCOLON
680.1 000000 PUBLIC ICCOMMA
680.2 001082 .... DW link
680.3 001084 FF DB 0FFh ; not immediate
680.4 001085 link SET $
680.5 001085 03 DB 3
680.6 001086 49432C DB 'IC,'
680.7 001089 00 EVEN
680.8 00108A IF 'DOCOLON'='DOCODE'
680.9 00108A ICCOMMA: DW $+2
680.10 00108A ELSE
680.11 00108A .... ICCOMMA: DW DOCOLON
680.12 00108C ENDIF
680.13 00108C ENDM
681 00108C ............* DW IHERE,ICSTORE,lit,1,CHARS,IALLOT,EXIT
682 00109A
683 00109A ; SEPARATE HEADER EXTENSIONS ARE NOT USED
684 00109A #define HHERE IHERE
685 00109A #define HALLOT IALLOT
686 00109A #define HCOMMA ICOMMA
687 00109A #define HCCOMMA ICCOMMA
688 00109A #define HCFETCH ICFETCH
689 00109A #define HFETCH IFETCH
690 00109A #define HCSTORE ICSTORE
691 00109A #define HSTORE ISTORE
692 00109A
693 00109A ; INTERPRETER ==================================
=
694 00109A ; Note that NFA>LFA, NFA>CFA, IMMED?, and
FIND
695 00109A ; are dependent on the structure of the
Forth
696 00109A ; header. This may be common across many
CPUs,
697 00109A ; or it may be different.
698 00109A
699 00109A ;C SOURCE -- adr n current input buffer
700 00109A ; 'SOURCE 2@ ; length is at lower
adrs
701 00109A HEADER SOURCE,6,'SOURCE',DOCOLON
701.1 000000 PUBLIC SOURCE
701.2 00109A .... DW link
701.3 00109C FF DB 0FFh ; not immediate
701.4 00109D link SET $
701.5 00109D 06 DB 6
701.6 00109E 534F55524345 DB 'SOURCE'
701.7 0010A4 EVEN
701.8 0010A4 IF 'DOCOLON'='DOCODE'
701.9 0010A4 SOURCE: DW $+2
701.10 0010A4 ELSE
701.11 0010A4 .... SOURCE: DW DOCOLON
701.12 0010A6 ENDIF
701.13 0010A6 ENDM
702 0010A6 ............ DW TICKSOURCE,TWOFETCH,EXIT
703 0010AC
704 0010AC ;X /STRING a u n -- a+n u-n trim string
705 0010AC ; ROT OVER + ROT ROT - ;
706 0010AC HEADER SLASHSTRING,7,'/STRING',DOCOLON
706.1 000000 PUBLIC SLASHSTRING
706.2 0010AC .... DW link
706.3 0010AE FF DB 0FFh ; not immediate
706.4 0010AF link SET $
706.5 0010AF 07 DB 7
706.6 0010B0 2F535452494E* DB '/STRING'
706.7 0010B7 00 EVEN
706.8 0010B8 IF 'DOCOLON'='DOCODE'
706.9 0010B8 SLASHSTRING: DW $+2
706.10 0010B8 ELSE
706.11 0010B8 .... SLASHSTRING: DW DOCOLON
706.12 0010BA ENDIF
706.13 0010BA ENDM
707 0010BA ............* DW ROT,OVER,PLUS,ROT,ROT,MINUS,EXIT
708 0010C8
709 0010C8 ;Z >counted src n dst -- copy to counted
str
710 0010C8 ; 2DUP C! CHAR+ SWAP CMOVE ;
711 0010C8 HEADER TOCOUNTED,8,'>COUNTED',DOCOLON
711.1 000000 PUBLIC TOCOUNTED
711.2 0010C8 .... DW link
711.3 0010CA FF DB 0FFh ; not immediate
711.4 0010CB link SET $
711.5 0010CB 08 DB 8
711.6 0010CC 3E434F554E54* DB '>COUNTED'
711.7 0010D4 EVEN
711.8 0010D4 IF 'DOCOLON'='DOCODE'
711.9 0010D4 TOCOUNTED: DW $+2
711.10 0010D4 ELSE
711.11 0010D4 .... TOCOUNTED: DW DOCOLON
711.12 0010D6 ENDIF
711.13 0010D6 ENDM
712 0010D6 ............* DW TWODUP,CSTORE,CHARPLUS,SWAP,CMOVE,EXI
T
713 0010E2
714 0010E2 ;C WORD char -- c-addr n word delim'd by
char
715 0010E2 ; DUP SOURCE >IN @ /STRING -- c c adr
n
716 0010E2 ; DUP >R ROT SKIP -- c adr'
n'
717 0010E2 ; OVER >R ROT SCAN -- adr"
n"
718 0010E2 ; DUP IF CHAR- THEN skip trailing
delim.
719 0010E2 ; R> R> ROT - >IN +! update >IN
offset
720 0010E2 ; TUCK - -- adr'
N
721 0010E2 ; HERE >counted --
722 0010E2 ; HERE -- a
723 0010E2 ; BL OVER COUNT + C! ; append trailing
blank
724 0010E2 HEADER WORDD,4,'WORD',DOCOLON
724.1 000000 PUBLIC WORDD
724.2 0010E2 .... DW link
724.3 0010E4 FF DB 0FFh ; not immediate
724.4 0010E5 link SET $
724.5 0010E5 04 DB 4
724.6 0010E6 574F5244 DB 'WORD'
724.7 0010EA EVEN
724.8 0010EA IF 'DOCOLON'='DOCODE'
724.9 0010EA WORDD: DW $+2
724.10 0010EA ELSE
724.11 0010EA .... WORDD: DW DOCOLON
724.12 0010EC ENDIF
724.13 0010EC ENDM
725 0010EC ............* DW DUP,SOURCE,TOIN,FETCH,SLASHSTRING
726 0010F6 ............* DW DUP,TOR,ROT,SKIP
727 0010FE ............* DW OVER,TOR,ROT,SCAN
728 001106 ........ DW DUP,qbran
729 00110A DEST WORD1
729.1 00110A 0400 DW WORD1-$
729.2 00110C ENDM
730 00110C .... DW ONEMINUS ; char-
731 00110E ............*WORD1: DW RFROM,RFROM,ROT,MINUS,TOIN,PLUSSTORE
732 00111A ........ DW TUCK,MINUS
733 00111E ............ DW HERE,TOCOUNTED,HERE
734 001124 ............* DW BLANK,OVER,COUNT,PLUS,CSTORE,EXIT
735 001130
736 001130 ;Z NFA>LFA nfa -- lfa name adr -> link
field
737 001130 ; 3 - ;
738 001130 HEADER NFATOLFA,7,'NFA>LFA',DOCOLON
738.1 000000 PUBLIC NFATOLFA
738.2 001130 .... DW link
738.3 001132 FF DB 0FFh ; not immediate
738.4 001133 link SET $
738.5 001133 07 DB 7
738.6 001134 4E46413E4C46* DB 'NFA>LFA'
738.7 00113B 00 EVEN
738.8 00113C IF 'DOCOLON'='DOCODE'
738.9 00113C NFATOLFA: DW $+2
738.10 00113C ELSE
738.11 00113C .... NFATOLFA: DW DOCOLON
738.12 00113E ENDIF
738.13 00113E ENDM
739 00113E ....0300....* DW lit,3,MINUS,EXIT
740 001146
741 001146 ;Z NFA>CFA nfa -- cfa name adr -> code
field
742 001146 ; HCOUNT 7F AND + ALIGNED ; mask off
'smudge' bit
743 001146 HEADER NFATOCFA,7,'NFA>CFA',DOCOLON
743.1 000000 PUBLIC NFATOCFA
743.2 001146 .... DW link
743.3 001148 FF DB 0FFh ; not immediate
743.4 001149 link SET $
743.5 001149 07 DB 7
743.6 00114A 4E46413E4346* DB 'NFA>CFA'
743.7 001151 00 EVEN
743.8 001152 IF 'DOCOLON'='DOCODE'
743.9 001152 NFATOCFA: DW $+2
743.10 001152 ELSE
743.11 001152 .... NFATOCFA: DW DOCOLON
743.12 001154 ENDIF
743.13 001154 ENDM
744 001154 .... DW HCOUNT
745 001156 ....7F00....* DW lit,07FH,ANDD,PLUS,ALIGNED,EXIT
746 001162
747 001162 ;Z IMMED? nfa -- f fetch immediate
flag
748 001162 ; 1- HC@ 1 AND 0= ; Flashable model, LSB=0
if immed
749 001162 HEADER IMMEDQ,6,'IMMED?',DOCOLON
749.1 000000 PUBLIC IMMEDQ
749.2 001162 .... DW link
749.3 001164 FF DB 0FFh ; not immediate
749.4 001165 link SET $
749.5 001165 06 DB 6
749.6 001166 494D4D45443F DB 'IMMED?'
749.7 00116C EVEN
749.8 00116C IF 'DOCOLON'='DOCODE'
749.9 00116C IMMEDQ: DW $+2
749.10 00116C ELSE
749.11 00116C .... IMMEDQ: DW DOCOLON
749.12 00116E ENDIF
749.13 00116E ENDM
750 00116E ............* DW ONEMINUS,HCFETCH,lit,1,ANDD,ZEROEQUAL
,EXIT
751 00117C
752 00117C ;C FIND c-addr -- c-addr 0 if not found
753 00117C ;C xt 1 if immediate
754 00117C ;C xt -1 if "normal"
755 00117C ; LATEST @ BEGIN -- a nfa
756 00117C ; 2DUP OVER C@ CHAR+ -- a nfa a nfa
n+1
757 00117C ; N= -- a nfa
f
758 00117C ; DUP IF
759 00117C ; DROP
760 00117C ; NFA>LFA H@ DUP -- a link
link
761 00117C ; THEN
762 00117C ; 0= UNTIL -- a nfa OR a
0
763 00117C ; DUP IF
764 00117C ; NIP DUP NFA>CFA -- nfa xt
765 00117C ; SWAP IMMED? -- xt iflag
766 00117C ; 0= 1 OR -- xt 1/-1
767 00117C ; THEN ;
768 00117C HEADER FIND,4,'FIND',DOCOLON
768.1 000000 PUBLIC FIND
768.2 00117C .... DW link
768.3 00117E FF DB 0FFh ; not immediate
768.4 00117F link SET $
768.5 00117F 04 DB 4
768.6 001180 46494E44 DB 'FIND'
768.7 001184 EVEN
768.8 001184 IF 'DOCOLON'='DOCODE'
768.9 001184 FIND: DW $+2
768.10 001184 ELSE
768.11 001184 .... FIND: DW DOCOLON
768.12 001186 ENDIF
768.13 001186 ENDM
769 001186 ........ DW LATEST,FETCH
770 00118A ............*FIND1: DW TWODUP,OVER,CFETCH,CHARPLUS
771 001192 ............ DW NEQUAL,DUP,qbran
772 001198 DEST FIND2
772.1 001198 0A00 DW FIND2-$
772.2 00119A ENDM
773 00119A ............* DW DROP,NFATOLFA,HFETCH,DUP
774 0011A2 ........ FIND2: DW ZEROEQUAL,qbran
775 0011A6 DEST FIND1
775.1 0011A6 E4FF DW FIND1-$
775.2 0011A8 ENDM
776 0011A8 ........ DW DUP,qbran
777 0011AC DEST FIND3
777.1 0011AC 1400 DW FIND3-$
777.2 0011AE ENDM
778 0011AE ............ DW NIP,DUP,NFATOCFA
779 0011B4 ............* DW SWAP,IMMEDQ,ZEROEQUAL,lit,1,ORR
780 0011C0 .... FIND3: DW EXIT
781 0011C2
782 0011C2 ;C UPC char -- char capitalize character
783 0011C2 ;
784 0011C2 ; DUP [CHAR] a < OVER [CHAR] z > OR IF EXIT THEN
785 0011C2 ; [ CHAR A CHAR a - ] LITERAL + ;
786 0011C2 ; HEADER UPC,3,'UPC',DOCOLON
787 0011C2 HEADLESS UPC, DOCOLON
787.1 000000 PUBLIC UPC
787.2 0011C2 IF 'DOCOLON'='DOCODE'
787.3 0011C2 UPC: DW $+2
787.4 0011C2 ELSE
787.5 0011C2 .... UPC: DW DOCOLON
787.6 0011C4 ENDIF
787.7 0011C4 ENDM
788 0011C4 ........6100* DW DUP, lit, 'a', LESS, OVER, lit, 'z',
GREATER
789 0011D4 ........ DW ORR, qbran
790 0011D8 DEST UPC1
790.1 0011D8 0400 DW UPC1-$
790.2 0011DA ENDM
791 0011DA .... DW EXIT
792 0011DC ....E0FF.... UPC1: DW lit, 'A'-'a', PLUS
793 0011E2 .... DW EXIT
794 0011E4
795 0011E4 ;C CAPITALIZE c-addr -- c-addr capitalize
string
796 0011E4 ;
797 0011E4 ; CAPS @ IF DUP COUNT OVER + SWAP ?DO I c@ upc
I c! LOOP THEN
798 0011E4 ; HEADER CAPITALIZE, 10, 'CAPITALIZE',
DOCOLON
799 0011E4 HEADLESS CAPITALIZE, DOCOLON
799.1 000000 PUBLIC CAPITALIZE
799.2 0011E4 IF 'DOCOLON'='DOCODE'
799.3 0011E4 CAPITALIZE: DW $+2
799.4 0011E4 ELSE
799.5 0011E4 .... CAPITALIZE: DW DOCOLON
799.6 0011E6 ENDIF
799.7 0011E6 ENDM
800 0011E6 ............ DW CAPS, FETCH, qbran
801 0011EC DEST CAPS2
801.1 0011EC 1C00 DW CAPS2-$
801.2 0011EE ENDM
802 0011EE ............* DW DUP, COUNT, OVER, PLUS, SWAP,
xdo
803 0011FA ............*CAPS1: DW II, CFETCH, UPC, II, CSTORE
804 001204 .... DW xloop
805 001206 DEST CAPS1
805.1 001206 F4FF DW CAPS1-$
805.2 001208 ENDM
806 001208 .... CAPS2: DW EXIT
807 00120A
808 00120A ;C LITERAL x -- append numeric
literal
809 00120A ; STATE @ IF ['] LIT ,XT I, THEN ; IMMEDIATE
810 00120A ; This tests STATE so that it can also be
used
811 00120A ; interpretively. (ANSI doesn't require
this.)
812 00120A IMMED LITERAL,7,'LITERAL',DOCOLON
812.1 000000 PUBLIC LITERAL
812.2 00120A .... DW link
812.3 00120C FE DB 0FEh // ; immediate
(LSB=0)
812.4 00120D link SET $
812.5 00120D 07 DB 7
812.6 00120E 4C4954455241* DB 'LITERAL'
812.7 001215 00 EVEN
812.8 001216 IF 'DOCOLON'='DOCODE'
812.9 001216 LITERAL: DW $+2
812.10 001216 ELSE
812.11 001216 .... LITERAL: DW DOCOLON
812.12 001218 ENDIF
812.13 001218 ENDM
813 001218 ............ DW STATE,FETCH,qbran
814 00121E DEST LITER1
814.1 00121E 0A00 DW LITER1-$
814.2 001220 ENDM
815 001220 ............* DW lit,lit,COMMAXT,ICOMMA
816 001228 .... LITER1: DW EXIT
817 00122A
818 00122A ;Z DIGIT? c -- n -1 if c is a valid
digit
819 00122A ;Z -- x 0 otherwise
820 00122A ; [ HEX ] DUP 39 > 100 AND + silly
looking
821 00122A ; DUP 140 > 107 AND - 30 - but it
works!
822 00122A ; DUP BASE @ U< ;
823 00122A HEADER DIGITQ,6,'DIGIT?',DOCOLON
823.1 000000 PUBLIC DIGITQ
823.2 00122A .... DW link
823.3 00122C FF DB 0FFh ; not immediate
823.4 00122D link SET $
823.5 00122D 06 DB 6
823.6 00122E 44494749543F DB 'DIGIT?'
823.7 001234 EVEN
823.8 001234 IF 'DOCOLON'='DOCODE'
823.9 001234 DIGITQ: DW $+2
823.10 001234 ELSE
823.11 001234 .... DIGITQ: DW DOCOLON
823.12 001236 ENDIF
823.13 001236 ENDM
824 001236 ........3900* DW DUP,lit,39H,GREATER,lit,100H,ANDD,PLU
S
825 001246 ........4001* DW DUP,lit,140H,GREATER,lit,107H,ANDD
826 001254 ........3000* DW MINUS,lit,30H,MINUS
827 00125C ............* DW DUP,BASE,FETCH,ULESS,EXIT
828 001266
829 001266 ;Z ?SIGN adr n -- adr' n' f get optional
sign
830 001266 ;Z advance adr/n if sign; return NZ if
negative
831 001266 ; OVER C@ -- adr n c
832 001266 ; 2C - DUP ABS 1 = AND -- +=-1, -=+1, else
0
833 001266 ; DUP IF 1+ -- +=0, -=+2
834 001266 ; >R 1 /STRING R> -- adr' n'
f
835 001266 ; THEN ;
836 001266 HEADER QSIGN,5,'?SIGN',DOCOLON
836.1 000000 PUBLIC QSIGN
836.2 001266 .... DW link
836.3 001268 FF DB 0FFh ; not immediate
836.4 001269 link SET $
836.5 001269 05 DB 5
836.6 00126A 3F5349474E DB '?SIGN'
836.7 00126F 00 EVEN
836.8 001270 IF 'DOCOLON'='DOCODE'
836.9 001270 QSIGN: DW $+2
836.10 001270 ELSE
836.11 001270 .... QSIGN: DW DOCOLON
836.12 001272 ENDIF
836.13 001272 ENDM
837 001272 ............* DW OVER,CFETCH,lit,2CH,MINUS,DUP,ABBS
838 001280 ....0100....* DW lit,1,EQUAL,ANDD,DUP,qbran
839 00128C DEST QSIGN1
839.1 00128C 0E00 DW QSIGN1-$
839.2 00128E ENDM
840 00128E ............* DW ONEPLUS,TOR,lit,1,SLASHSTRING,RFROM
841 00129A .... QSIGN1: DW EXIT
842 00129C
843 00129C ;C >NUMBER ud adr u -- ud' adr' u'
844 00129C ;C convert string to
number
845 00129C ; BEGIN
846 00129C ; DUP WHILE
847 00129C ; OVER C@ DIGIT?
848 00129C ; 0= IF DROP EXIT THEN
849 00129C ; >R 2SWAP BASE @ UD*
850 00129C ; R> M+ 2SWAP
851 00129C ; 1 /STRING
852 00129C ; REPEAT ;
853 00129C HEADER TONUMBER,7,'>NUMBER',DOCOLON
853.1 000000 PUBLIC TONUMBER
853.2 00129C .... DW link
853.3 00129E FF DB 0FFh ; not immediate
853.4 00129F link SET $
853.5 00129F 07 DB 7
853.6 0012A0 3E4E554D4245* DB '>NUMBER'
853.7 0012A7 00 EVEN
853.8 0012A8 IF 'DOCOLON'='DOCODE'
853.9 0012A8 TONUMBER: DW $+2
853.10 0012A8 ELSE
853.11 0012A8 .... TONUMBER: DW DOCOLON
853.12 0012AA ENDIF
853.13 0012AA ENDM
854 0012AA ........ TONUM1: DW DUP,qbran
855 0012AE DEST TONUM3
855.1 0012AE 2C00 DW TONUM3-$
855.2 0012B0 ENDM
856 0012B0 ............ DW OVER,CFETCH,DIGITQ
857 0012B6 ........ DW ZEROEQUAL,qbran
858 0012BA DEST TONUM2
858.1 0012BA 0600 DW TONUM2-$
858.2 0012BC ENDM
859 0012BC ........ DW DROP,EXIT
860 0012C0 ............*TONUM2: DW TOR,TWOSWAP,BASE,FETCH,UDSTAR
861 0012CA ............ DW RFROM,MPLUS,TWOSWAP
862 0012D0 ....0100....* DW lit,1,SLASHSTRING,bran
863 0012D8 DEST TONUM1
863.1 0012D8 D2FF DW TONUM1-$
863.2 0012DA ENDM
864 0012DA .... TONUM3: DW EXIT
865 0012DC
866 0012DC ;Z ?NUMBER c-addr -- n -1 string->number
867 0012DC ;Z -- c-addr 0 if convert
error
868 0012DC ; DUP 0 0 ROT COUNT -- ca ud adr
n
869 0012DC ; ?SIGN >R >NUMBER -- ca ud adr'
n'
870 0012DC ; IF R> 2DROP 2DROP 0 -- ca 0 (error)
871 0012DC ; ELSE 2DROP NIP R>
872 0012DC ; IF NEGATE THEN -1 -- n -1 (ok)
873 0012DC ; THEN ;
874 0012DC HEADER QNUMBER,7,'?NUMBER',DOCOLON
874.1 000000 PUBLIC QNUMBER
874.2 0012DC .... DW link
874.3 0012DE FF DB 0FFh ; not immediate
874.4 0012DF link SET $
874.5 0012DF 07 DB 7
874.6 0012E0 3F4E554D4245* DB '?NUMBER'
874.7 0012E7 00 EVEN
874.8 0012E8 IF 'DOCOLON'='DOCODE'
874.9 0012E8 QNUMBER: DW $+2
874.10 0012E8 ELSE
874.11 0012E8 .... QNUMBER: DW DOCOLON
874.12 0012EA ENDIF
874.13 0012EA ENDM
875 0012EA ........0000* DW DUP,lit,0,DUP,ROT,COUNT
876 0012F6 ............* DW QSIGN,TOR,TONUMBER,qbran
877 0012FE DEST QNUM1
877.1 0012FE 1000 DW QNUM1-$
877.2 001300 ENDM
878 001300 ............* DW RFROM,TWODROP,TWODROP,lit,0
879 00130A .... DW bran
880 00130C DEST QNUM3
880.1 00130C 1200 DW QNUM3-$
880.2 00130E ENDM
881 00130E ............*QNUM1: DW TWODROP,NIP,RFROM,qbran
882 001316 DEST QNUM2
882.1 001316 0400 DW QNUM2-$
882.2 001318 ENDM
883 001318 .... DW NEGATE
884 00131A ....FFFF QNUM2: DW lit,-1
885 00131E .... QNUM3: DW EXIT
886 001320
887 001320 ;Z INTERPRET i*x c-addr u -- j*x
888 001320 ;Z interpret given
buffer
889 001320 ; This is a common factor of EVALUATE and
QUIT.
890 001320 ; ref. dpANS-6, 3.4 The Forth Text Interpreter
891 001320 ; 'SOURCE 2! 0 >IN !
892 001320 ; BEGIN
893 001320 ; BL WORD DUP C@ WHILE -- textadr
894 001320 ; CAPITALIZE
895 001320 ; FIND -- a 0/1/-1
896 001320 ; ?DUP IF -- xt 1/-1
897 001320 ; 1+ STATE @ 0= OR IMMED or
interp?
898 001320 ; IF EXECUTE ELSE ,XT THEN
899 001320 ; ELSE -- textadr
900 001320 ; ?NUMBER
901 001320 ; IF POSTPONE LITERAL converted
ok
902 001320 ; ELSE COUNT TYPE 3F EMIT CR ABORT
err
903 001320 ; THEN
904 001320 ; THEN
905 001320 ; REPEAT DROP ;
906 001320 HEADER INTERPRET,9,'INTERPRET',DOCOLON
906.1 000000 PUBLIC INTERPRET
906.2 001320 .... DW link
906.3 001322 FF DB 0FFh ; not immediate
906.4 001323 link SET $
906.5 001323 09 DB 9
906.6 001324 494E54455250* DB 'INTERPRET'
906.7 00132D 00 EVEN
906.8 00132E IF 'DOCOLON'='DOCODE'
906.9 00132E INTERPRET: DW $+2
906.10 00132E ELSE
906.11 00132E .... INTERPRET: DW DOCOLON
906.12 001330 ENDIF
906.13 001330 ENDM
907 001330 ............* DW TICKSOURCE,TWOSTORE,lit,0,TOIN,STORE
908 00133C ............*INTER1: DW BLANK,WORDD,DUP,CFETCH,qbran
909 001346 DEST INTER9
909.1 001346 4400 DW INTER9-$
909.2 001348 ENDM
910 001348 .... DW CAPITALIZE
911 00134A ............ DW FIND,QDUP,qbran
912 001350 DEST INTER4
912.1 001350 1C00 DW INTER4-$
912.2 001352 ENDM
913 001352 ............* DW ONEPLUS,STATE,FETCH,ZEROEQUAL,ORR
914 00135C .... DW qbran
915 00135E DEST INTER2
915.1 00135E 0800 DW INTER2-$
915.2 001360 ENDM
916 001360 ........ DW EXECUTE,bran
917 001364 DEST INTER3
917.1 001364 0400 DW INTER3-$
917.2 001366 ENDM
918 001366 .... INTER2: DW COMMAXT
919 001368 .... INTER3: DW bran
920 00136A DEST INTER8
920.1 00136A 1C00 DW INTER8-$
920.2 00136C ENDM
921 00136C ........ INTER4: DW QNUMBER,qbran
922 001370 DEST INTER5
922.1 001370 0800 DW INTER5-$
922.2 001372 ENDM
923 001372 ........ DW LITERAL,bran
924 001376 DEST INTER6
924.1 001376 1000 DW INTER6-$
924.2 001378 ENDM
925 001378 ............*INTER5: DW COUNT,TYP,lit,3FH,EMIT,CR,ABORT
926 001386 INTER6:
927 001386 .... INTER8: DW bran
928 001388 DEST INTER1
928.1 001388 B4FF DW INTER1-$
928.2 00138A ENDM
929 00138A ........ INTER9: DW DROP,EXIT
930 00138E
931 00138E ;C EVALUATE i*x c-addr u -- j*x interprt
string
932 00138E ; 'SOURCE 2@ >R >R >IN @ >R
933 00138E ; INTERPRET
934 00138E ; R> >IN ! R> R> 'SOURCE 2! ;
935 00138E HEADER EVALUATE,8,'EVALUATE',DOCOLON
935.1 000000 PUBLIC EVALUATE
935.2 00138E .... DW link
935.3 001390 FF DB 0FFh ; not immediate
935.4 001391 link SET $
935.5 001391 08 DB 8
935.6 001392 4556414C5541* DB 'EVALUATE'
935.7 00139A EVEN
935.8 00139A IF 'DOCOLON'='DOCODE'
935.9 00139A EVALUATE: DW $+2
935.10 00139A ELSE
935.11 00139A .... EVALUATE: DW DOCOLON
935.12 00139C ENDIF
935.13 00139C ENDM
936 00139C ............* DW TICKSOURCE,TWOFETCH,TOR,TOR
937 0013A4 ............* DW TOIN,FETCH,TOR,INTERPRET
938 0013AC ............* DW RFROM,TOIN,STORE,RFROM,RFROM
939 0013B6 ............ DW TICKSOURCE,TWOSTORE,EXIT
940 0013BC
941 0013BC #define PREFIXPROMPT 0
942 0013BC
943 0013BC ; C DOTSTATUS -- display system status
944 0013BC HEADLESS DOTSTATUS,DOCOLON
944.1 000000 PUBLIC DOTSTATUS
944.2 0013BC IF 'DOCOLON'='DOCODE'
944.3 0013BC DOTSTATUS: DW $+2
944.4 0013BC ELSE
944.5 0013BC .... DOTSTATUS: DW DOCOLON
944.6 0013BE ENDIF
944.7 0013BE ENDM
945 0013BE ....1100.... DW lit,11H,EMIT ; send XON
946 0013C4 .... DW CR
947 0013C6 IF PREFIXPROMPT=1
948 0013C6 DW XISQUOTE
949 0013C6 DB 3,'OK ' ; for prefix prompt
style
950 0013C6 DW ITYPE
951 0013C6 ENDIF
952 0013C6 .... DW EXIT
953 0013C8
954 0013C8 ; C PROMPT -- prompt user
955 0013C8 HEADLESS PROMPT,DOCOLON
955.1 000000 PUBLIC PROMPT
955.2 0013C8 IF 'DOCOLON'='DOCODE'
955.3 0013C8 PROMPT: DW $+2
955.4 0013C8 ELSE
955.5 0013C8 .... PROMPT: DW DOCOLON
955.6 0013CA ENDIF
955.7 0013CA ENDM
956 0013CA IF PREFIXPROMPT!=1
957 0013CA ............* DW STATE,FETCH,ZEROEQUAL,qbran
958 0013D2 DEST PROMPT1
958.1 0013D2 0A00 DW PROMPT1-$
958.2 0013D4 ENDM
959 0013D4 .... DW XISQUOTE
960 0013D6 036F6B20 DB 3,'ok ' ; for traditional Forth
style
961 0013DA .... DW ITYPE
962 0013DC ENDIF
963 0013DC .... PROMPT1:DW EXIT
964 0013DE
965 0013DE ;C QUIT -- R: i*x -- interpret from
kbd
966 0013DE ; L0 LP ! R0 RP! 0 STATE !
967 0013DE ; BEGIN
968 0013DE ; xon EMIT
969 0013DE ; TIB DUP TIBSIZE ACCEPT
970 0013DE ; xoff EMIT SPACE
971 0013DE ; INTERPRET
972 0013DE ; CR STATE @ 0= IF ." OK" THEN
973 0013DE ; AGAIN ;
974 0013DE HEADER QUIT,4,'QUIT',DOCOLON
974.1 000000 PUBLIC QUIT
974.2 0013DE .... DW link
974.3 0013E0 FF DB 0FFh ; not immediate
974.4 0013E1 link SET $
974.5 0013E1 04 DB 4
974.6 0013E2 51554954 DB 'QUIT'
974.7 0013E6 EVEN
974.8 0013E6 IF 'DOCOLON'='DOCODE'
974.9 0013E6 QUIT: DW $+2
974.10 0013E6 ELSE
974.11 0013E6 .... QUIT: DW DOCOLON
974.12 0013E8 ENDIF
974.13 0013E8 ENDM
975 0013E8 ............ DW L0,LP,STORE
976 0013EE ............* DW RZERO,RPSTORE,lit,0,STATE,STORE
977 0013FA .... QUIT1: DW DOTSTATUS
978 0013FC ............* DW TIB,DUP,TIBSIZE,ACCEPT
979 001404 ; DW lit,13H,EMIT ; send
XOFF
980 001404 .... DW SPACE
981 001406 .... DW INTERPRET
982 001408 .... DW PROMPT
983 00140A .... DW bran
984 00140C DEST QUIT1
984.1 00140C EEFF DW QUIT1-$
984.2 00140E ENDM
985 000000 PUBLIC QUITIP
986 00140E QUITIP equ QUIT+2
987 00140E
988 00140E
989 00140E
990 00140E ;C ABORT i*x -- R: j*x -- clear stk &
QUIT
991 00140E ; S0 SP! QUIT ;
992 00140E HEADER ABORT,5,'ABORT',DOCOLON
992.1 000000 PUBLIC ABORT
992.2 00140E .... DW link
992.3 001410 FF DB 0FFh ; not immediate
992.4 001411 link SET $
992.5 001411 05 DB 5
992.6 001412 41424F5254 DB 'ABORT'
992.7 001417 00 EVEN
992.8 001418 IF 'DOCOLON'='DOCODE'
992.9 001418 ABORT: DW $+2
992.10 001418 ELSE
992.11 001418 .... ABORT: DW DOCOLON
992.12 00141A ENDIF
992.13 00141A ENDM
993 00141A ............ DW S0,SPSTORE,QUIT ; QUIT never
returns
994 001420
995 001420 ;Z ?ABORT f c-addr u -- abort & print
msg
996 001420 ; ROT IF ITYPE ABORT THEN 2DROP ;
997 001420 HEADER QABORT,6,'?ABORT',DOCOLON
997.1 000000 PUBLIC QABORT
997.2 001420 .... DW link
997.3 001422 FF DB 0FFh ; not immediate
997.4 001423 link SET $
997.5 001423 06 DB 6
997.6 001424 3F41424F5254 DB '?ABORT'
997.7 00142A EVEN
997.8 00142A IF 'DOCOLON'='DOCODE'
997.9 00142A QABORT: DW $+2
997.10 00142A ELSE
997.11 00142A .... QABORT: DW DOCOLON
997.12 00142C ENDIF
997.13 00142C ENDM
998 00142C ........ DW ROT,qbran
999 001430 DEST QABO1
999.1 001430 0600 DW QABO1-$
999.2 001432 ENDM
1000 001432 ........ DW ITYPE,ABORT
1001 001436 ........ QABO1: DW TWODROP,EXIT
1002 00143A
1003 00143A ;C ABORT" i*x 0 -- i*x R: j*x -- j*x
x1=0
1004 00143A ;C i*x x1 -- R: j*x --
x1<>0
1005 00143A ; POSTPONE IS" POSTPONE ?ABORT ; IMMEDIATE
1006 00143A IMMED ABORTQUOTE,6,'ABORT"',DOCOLON
1006.1 000000 PUBLIC ABORTQUOTE
1006.2 00143A .... DW link
1006.3 00143C FE DB 0FEh // ; immediate
(LSB=0
)
1006.4 00143D link SET $
1006.5 00143D 06 DB 6
1006.6 00143E 41424F525422 DB 'ABORT"'
1006.7 001444 EVEN
1006.8 001444 IF 'DOCOLON'='DOCODE'
1006.9 001444 ABORTQUOTE: DW $+2
1006.10 001444 ELSE
1006.11 001444 .... ABORTQUOTE: DW DOCOLON
1006.12 001446 ENDIF
1006.13 001446 ENDM
1007 001446 .... DW ISQUOTE
1008 001448 ............ DW lit,QABORT,COMMAXT
1009 00144E .... DW EXIT
1010 001450
1011 001450 ;C ' -- xt find word in dictionary
1012 001450 ; BL WORD CAPITALIZE FIND
1013 001450 ; 0= ABORT" ?" ;
1014 001450 HEADER TICK,1,27h,DOCOLON
1014.1 000000 PUBLIC TICK
1014.2 001450 .... DW link
1014.3 001452 FF DB 0FFh ; not immediate
1014.4 001453 link SET $
1014.5 001453 01 DB 1
1014.6 001454 27 DB 27h
1014.7 001455 00 EVEN
1014.8 001456 IF 'DOCOLON'='DOCODE'
1014.9 001456 TICK: DW $+2
1014.10 001456 ELSE
1014.11 001456 .... TICK: DW DOCOLON
1014.12 001458 ENDIF
1014.13 001458 ENDM
1015 001458 ............* DW BLANK,WORDD,CAPITALIZE,FIND,ZEROEQUAL
,XISQUOTE
1016 001464 013F DB 1,'?'
1017 001466 ........ DW QABORT,EXIT
1018 00146A
1019 00146A ;C CHAR -- char parse ASCII
character
1020 00146A ; BL WORD 1+ C@ ;
1021 00146A HEADER CHARR,4,'CHAR',DOCOLON
1021.1 000000 PUBLIC CHARR
1021.2 00146A .... DW link
1021.3 00146C FF DB 0FFh ; not immediate
1021.4 00146D link SET $
1021.5 00146D 04 DB 4
1021.6 00146E 43484152 DB 'CHAR'
1021.7 001472 EVEN
1021.8 001472 IF 'DOCOLON'='DOCODE'
1021.9 001472 CHARR: DW $+2
1021.10 001472 ELSE
1021.11 001472 .... CHARR: DW DOCOLON
1021.12 001474 ENDIF
1021.13 001474 ENDM
1022 001474 ............* DW BLANK,WORDD,ONEPLUS,CFETCH,EXIT
1023 00147E
1024 00147E ;C [CHAR] -- compile character
literal
1025 00147E ; CHAR ['] LIT ,XT I, ; IMMEDIATE
1026 00147E IMMED BRACCHAR,6,'[CHAR]',DOCOLON
1026.1 000000 PUBLIC BRACCHAR
1026.2 00147E .... DW link
1026.3 001480 FE DB 0FEh // ; immediate
(LSB=0)
1026.4 001481 link SET $
1026.5 001481 06 DB 6
1026.6 001482 5B434841525D DB '[CHAR]'
1026.7 001488 EVEN
1026.8 001488 IF 'DOCOLON'='DOCODE'
1026.9 001488 BRACCHAR: DW $+2
1026.10 001488 ELSE
1026.11 001488 .... BRACCHAR: DW DOCOLON
1026.12 00148A ENDIF
1026.13 00148A ENDM
1027 00148A .... DW CHARR
1028 00148C ............ DW lit,lit,COMMAXT
1029 001492 ........ DW ICOMMA,EXIT
1030 001496
1031 001496 ;C ( -- skip input until
)
1032 001496 ; [ HEX ] 29 WORD DROP ; IMMEDIATE
1033 001496 IMMED PAREN,1,'(',DOCOLON
1033.1 000000 PUBLIC PAREN
1033.2 001496 .... DW link
1033.3 001498 FE DB 0FEh // ; immediate
(LSB=0)
1033.4 001499 link SET $
1033.5 001499 01 DB 1
1033.6 00149A 28 DB '('
1033.7 00149B 00 EVEN
1033.8 00149C IF 'DOCOLON'='DOCODE'
1033.9 00149C PAREN: DW $+2
1033.10 00149C ELSE
1033.11 00149C .... PAREN: DW DOCOLON
1033.12 00149E ENDIF
1033.13 00149E ENDM
1034 00149E ....2900....* DW lit,29H,WORDD,DROP,EXIT
1035 0014A8
1036 0014A8 ; COMPILER =====================================
=
1037 0014A8
1038 0014A8 ;Z HEADER -- create a Forth word
header
1039 0014A8 ; LATEST @ H, 0FF HC, link & IMMED
field
1040 0014A8 ; HHERE LATEST ! new "latest"
link
1041 0014A8 ; BL HWORD HC@ 1+ HALLOT name field
1042 0014A8 ; ALIGN ;
1043 0014A8 ; Separate headers model.
1044 0014A8 HEADER HEADR,6,'HEADER',DOCOLON
1044.1 000000 PUBLIC HEADR
1044.2 0014A8 .... DW link
1044.3 0014AA FF DB 0FFh ; not immediate
1044.4 0014AB link SET $
1044.5 0014AB 06 DB 6
1044.6 0014AC 484541444552 DB 'HEADER'
1044.7 0014B2 EVEN
1044.8 0014B2 IF 'DOCOLON'='DOCODE'
1044.9 0014B2 HEADR: DW $+2
1044.10 0014B2 ELSE
1044.11 0014B2 .... HEADR: DW DOCOLON
1044.12 0014B4 ENDIF
1044.13 0014B4 ENDM
1045 0014B4 ............ DW LATEST,FETCH,HCOMMA ; link
1046 0014BA ....FF00.... DW lit,0FFh,HCCOMMA ; immediate
flag - see
note
below
1047 0014C0 ............ DW HHERE,LATEST,STORE
1048 0014C6 ............* DW BLANK,HWORD,HCFETCH,ONEPLUS,HALLOT
1049 0014D0 ........ DW ALIGNN,EXIT ; MSP430: headers in I
space must be
aligned
1050 0014D4 ; Note for Flashable MSP430: when compiling to
RAM, we need to set
1051 0014D4 ; the immediate byte to 0FFH. When compiling to
Flash, the word IC!
1052 0014D4 ; will not write 0FFH to erased Flash (because
the byte is already 0FFH).
1053 0014D4 ; Thus we can write this byte at a later time
(with IMMEDIATE).
1054 0014D4
1055 0014D4 ;Z ) -- run-time action of
DOES>
1072 001506 ; R> adrs of headless DOES>
def'n
1073 001506 ; LATEST @ NFA>CFA code field to fix
up
1074 001506 ; !CF ;
1075 001506 HEADER XDOES,7,'(DOES>)',DOCOLON
1075.1 000000 PUBLIC XDOES
1075.2 001506 .... DW link
1075.3 001508 FF DB 0FFh ; not immediate
1075.4 001509 link SET $
1075.5 001509 07 DB 7
1075.6 00150A 28444F45533E* DB '(DOES>)'
1075.7 001511 00 EVEN
1075.8 001512 IF 'DOCOLON'='DOCODE'
1075.9 001512 XDOES: DW $+2
1075.10 001512 ELSE
1075.11 001512 .... XDOES: DW DOCOLON
1075.12 001514 ENDIF
1075.13 001514 ENDM
1076 001514 ............* DW RFROM,LATEST,FETCH,NFATOCFA,STORECF
1077 00151E .... DW EXIT
1078 001520
1079 001520 ;C DOES> -- change action of latest
def'n
1080 001520 ; COMPILE (DOES>)
1081 001520 ; dodoes ,JMP ; IMMEDIATE
1082 001520 ; Note that MSP430 uses a JMP, not a CALL, to
DODOES.
1083 001520 IMMED DOES,5,'DOES>',DOCOLON
1083.1 000000 PUBLIC DOES
1083.2 001520 .... DW link
1083.3 001522 FE DB 0FEh // ; immediate
(LSB=0)
1083.4 001523 link SET $
1083.5 001523 05 DB 5
1083.6 001524 444F45533E DB 'DOES>'
1083.7 001529 00 EVEN
1083.8 00152A IF 'DOCOLON'='DOCODE'
1083.9 00152A DOES: DW $+2
1083.10 00152A ELSE
1083.11 00152A .... DOES: DW DOCOLON
1083.12 00152C ENDIF
1083.13 00152C ENDM
1084 00152C ............ DW lit,XDOES,COMMAXT
1085 001532 ............* DW lit,dodoes,COMMAJMP,EXIT
1086 00153A
1087 00153A ;C RECURSE -- recurse current definition
1088 00153A ; LATEST @ NFA>CFA ,XT ; IMMEDIATE
1089 00153A ; NEWEST @ NFA>CFA ,XT ; IMMEDIATE
Flashable
1090 00153A IMMED RECURSE,7,'RECURSE',DOCOLON
1090.1 000000 PUBLIC RECURSE
1090.2 00153A .... DW link
1090.3 00153C FE DB 0FEh // ; immediate
(LSB=0)
1090.4 00153D link SET $
1090.5 00153D 07 DB 7
1090.6 00153E 524543555253* DB 'RECURSE'
1090.7 001545 00 EVEN
1090.8 001546 IF 'DOCOLON'='DOCODE'
1090.9 001546 RECURSE: DW $+2
1090.10 001546 ELSE
1090.11 001546 .... RECURSE: DW DOCOLON
1090.12 001548 ENDIF
1090.13 001548 ENDM
1091 001548 ............* DW NEWEST,FETCH,NFATOCFA,COMMAXT,EXIT
1092 001552
1093 001552 ;C [ -- enter interpretive
state
1094 001552 ; 0 STATE ! ; IMMEDIATE
1095 001552 IMMED LEFTBRACKET,1,'[',DOCOLON
1095.1 000000 PUBLIC LEFTBRACKET
1095.2 001552 .... DW link
1095.3 001554 FE DB 0FEh // ; immediate
(LSB=0)
1095.4 001555 link SET $
1095.5 001555 01 DB 1
1095.6 001556 5B DB '['
1095.7 001557 00 EVEN
1095.8 001558 IF 'DOCOLON'='DOCODE'
1095.9 001558 LEFTBRACKET: DW $+2
1095.10 001558 ELSE
1095.11 001558 .... LEFTBRACKET: DW DOCOLON
1095.12 00155A ENDIF
1095.13 00155A ENDM
1096 00155A ....0000....* DW lit,0,STATE,STORE,EXIT
1097 001564
1098 001564 ;C ] -- enter compiling state
1099 001564 ; -1 STATE ! ;
1100 001564 HEADER RIGHTBRACKET,1,']',DOCOLON
1100.1 000000 PUBLIC RIGHTBRACKET
1100.2 001564 .... DW link
1100.3 001566 FF DB 0FFh ; not immediate
1100.4 001567 link SET $
1100.5 001567 01 DB 1
1100.6 001568 5D DB ']'
1100.7 001569 00 EVEN
1100.8 00156A IF 'DOCOLON'='DOCODE'
1100.9 00156A RIGHTBRACKET: DW $+2
1100.10 00156A ELSE
1100.11 00156A .... RIGHTBRACKET: DW DOCOLON
1100.12 00156C ENDIF
1100.13 00156C ENDM
1101 00156C ....FFFF....* DW lit,-1,STATE,STORE,EXIT
1102 001576
1103 001576 ;Z HIDE -- "hide" latest definition
Flashable
1104 001576 ; LATEST @ DUP NEWEST ! NFA>LFA H@ LATEST !
;
1105 001576 HEADER HIDE,4,'HIDE',DOCOLON
1105.1 000000 PUBLIC HIDE
1105.2 001576 .... DW link
1105.3 001578 FF DB 0FFh ; not immediate
1105.4 001579 link SET $
1105.5 001579 04 DB 4
1105.6 00157A 48494445 DB 'HIDE'
1105.7 00157E EVEN
1105.8 00157E IF 'DOCOLON'='DOCODE'
1105.9 00157E HIDE: DW $+2
1105.10 00157E ELSE
1105.11 00157E .... HIDE: DW DOCOLON
1105.12 001580 ENDIF
1105.13 001580 ENDM
1106 001580 ............* DW LATEST,FETCH,DUP,NEWEST,STORE
1107 00158A ............* DW NFATOLFA,HFETCH,LATEST,STORE,EXIT
1108 001594
1109 001594 ;Z REVEAL -- "reveal" latest definition
Flashable
1110 001594 ; NEWEST @ LATEST ! ;
1111 001594 HEADER REVEAL,6,'REVEAL',DOCOLON
1111.1 000000 PUBLIC REVEAL
1111.2 001594 .... DW link
1111.3 001596 FF DB 0FFh ; not immediate
1111.4 001597 link SET $
1111.5 001597 06 DB 6
1111.6 001598 52455645414C DB 'REVEAL'
1111.7 00159E EVEN
1111.8 00159E IF 'DOCOLON'='DOCODE'
1111.9 00159E REVEAL: DW $+2
1111.10 00159E ELSE
1111.11 00159E .... REVEAL: DW DOCOLON
1111.12 0015A0 ENDIF
1111.13 0015A0 ENDM
1112 0015A0 ............* DW NEWEST,FETCH,LATEST,STORE,EXIT
1113 0015AA
1114 0015AA ;C IMMEDIATE -- make last def'n immediate
1115 0015AA ; 0FE LATEST @ 1- HC! ; set Flashable
immediate flag
1116 0015AA HEADER IMMEDIATE,9,'IMMEDIATE',DOCOLON
1116.1 000000 PUBLIC IMMEDIATE
1116.2 0015AA .... DW link
1116.3 0015AC FF DB 0FFh ; not immediate
1116.4 0015AD link SET $
1116.5 0015AD 09 DB 9
1116.6 0015AE 494D4D454449* DB 'IMMEDIATE'
1116.7 0015B7 00 EVEN
1116.8 0015B8 IF 'DOCOLON'='DOCODE'
1116.9 0015B8 IMMEDIATE: DW $+2
1116.10 0015B8 ELSE
1116.11 0015B8 .... IMMEDIATE: DW DOCOLON
1116.12 0015BA ENDIF
1116.13 0015BA ENDM
1117 0015BA ....FE00....* DW lit,0FEh,LATEST,FETCH,ONEMINUS,HCSTOR
E
1118 0015C6 .... DW EXIT
1119 0015C8
1120 0015C8 ;C : -- begin a colon definition
1121 0015C8 ; DUP CELL+ >R @ ,XT ;
1168 00163A ; The phrase ['] xxx ,XT appears so often
that
1169 00163A ; this word was created to combine the
actions
1170 00163A ; of LIT and ,XT. It takes an inline literal
1171 00163A ; execution token and appends it to the
dict.
1172 00163A ; HEADER COMPILE,7,'COMPILE',DOCOLON
1173 00163A ; DW RFROM,DUP,CELLPLUS,TOR
1174 00163A ; DW FETCH,COMMAXT,EXIT
1175 00163A ; N.B.: not used in the current implementation
1176 00163A
1177 00163A ; CONTROL STRUCTURES ===========================
=
1178 00163A
1179 00163A ;C IF -- adrs conditional forward
branch
1180 00163A ; ['] qbran ,BRANCH IHERE ,NONE ;
Flashable
1181 00163A ; IMMEDIATE
1182 00163A IMMED IFF,2,'IF',DOCOLON
1182.1 000000 PUBLIC IFF
1182.2 00163A .... DW link
1182.3 00163C FE DB 0FEh // ; immediate
(LSB=0)
1182.4 00163D link SET $
1182.5 00163D 02 DB 2
1182.6 00163E 4946 DB 'IF'
1182.7 001640 EVEN
1182.8 001640 IF 'DOCOLON'='DOCODE'
1182.9 001640 IFF: DW $+2
1182.10 001640 ELSE
1182.11 001640 .... IFF: DW DOCOLON
1182.12 001642 ENDIF
1182.13 001642 ENDM
1183 001642 ............ DW lit,qbran,COMMABRANCH
1184 001648 ............ DW IHERE,COMMANONE,EXIT
1185 00164E
1186 00164E ;C THEN adrs -- resolve forward
branch
1187 00164E ; IHERE SWAP !DEST ; IMMEDIATE
1188 00164E IMMED THEN,4,'THEN',DOCOLON
1188.1 000000 PUBLIC THEN
1188.2 00164E .... DW link
1188.3 001650 FE DB 0FEh // ; immediate
(LSB=0)
1188.4 001651 link SET $
1188.5 001651 04 DB 4
1188.6 001652 5448454E DB 'THEN'
1188.7 001656 EVEN
1188.8 001656 IF 'DOCOLON'='DOCODE'
1188.9 001656 THEN: DW $+2
1188.10 001656 ELSE
1188.11 001656 .... THEN: DW DOCOLON
1188.12 001658 ENDIF
1188.13 001658 ENDM
1189 001658 ............* DW IHERE,SWAP,STOREDEST,EXIT
1190 001660
1191 001660 ;C ELSE adrs1 -- adrs2 branch for
IF..ELSE
1192 001660 ; ['] branch ,BRANCH IHERE ,NONE
Flashable
1193 001660 ; SWAP POSTPONE THEN ; IMMEDIATE
1194 001660 IMMED ELSS,4,'ELSE',DOCOLON
1194.1 000000 PUBLIC ELSS
1194.2 001660 .... DW link
1194.3 001662 FE DB 0FEh // ; immediate
(LSB=0)
1194.4 001663 link SET $
1194.5 001663 04 DB 4
1194.6 001664 454C5345 DB 'ELSE'
1194.7 001668 EVEN
1194.8 001668 IF 'DOCOLON'='DOCODE'
1194.9 001668 ELSS: DW $+2
1194.10 001668 ELSE
1194.11 001668 .... ELSS: DW DOCOLON
1194.12 00166A ENDIF
1194.13 00166A ENDM
1195 00166A ............ DW lit,bran,COMMABRANCH
1196 001670 ........ DW IHERE,COMMANONE
1197 001674 ............ DW SWAP,THEN,EXIT
1198 00167A
1199 00167A ;C BEGIN -- adrs target for bwd.
branch
1200 00167A ; IHERE ; IMMEDIATE
1201 00167A IMMED BEGIN,5,'BEGIN',DOCOLON
1201.1 000000 PUBLIC BEGIN
1201.2 00167A .... DW link
1201.3 00167C FE DB 0FEh // ; immediate
(LSB=0)
1201.4 00167D link SET $
1201.5 00167D 05 DB 5
1201.6 00167E 424547494E DB 'BEGIN'
1201.7 001683 00 EVEN
1201.8 001684 IF 'DOCOLON'='DOCODE'
1201.9 001684 BEGIN: DW $+2
1201.10 001684 ELSE
1201.11 001684 .... BEGIN: DW DOCOLON
1201.12 001686 ENDIF
1201.13 001686 ENDM
1202 001686 ........ DW IHERE,EXIT
1203 00168A
1204 00168A ;C UNTIL adrs -- conditional backward
branch
1205 00168A ; ['] qbran ,BRANCH ,DEST ; IMMEDIATE
1206 00168A ; conditional backward branch
1207 00168A IMMED UNTIL,5,'UNTIL',DOCOLON
1207.1 000000 PUBLIC UNTIL
1207.2 00168A .... DW link
1207.3 00168C FE DB 0FEh // ; immediate
(LSB=0)
1207.4 00168D link SET $
1207.5 00168D 05 DB 5
1207.6 00168E 554E54494C DB 'UNTIL'
1207.7 001693 00 EVEN
1207.8 001694 IF 'DOCOLON'='DOCODE'
1207.9 001694 UNTIL: DW $+2
1207.10 001694 ELSE
1207.11 001694 .... UNTIL: DW DOCOLON
1207.12 001696 ENDIF
1207.13 001696 ENDM
1208 001696 ............ DW lit,qbran,COMMABRANCH
1209 00169C ........ DW COMMADEST,EXIT
1210 0016A0
1211 0016A0 ;X AGAIN adrs -- uncond'l backward
branch
1212 0016A0 ; ['] branch ,BRANCH ,DEST ; IMMEDIATE
1213 0016A0 ; unconditional backward branch
1214 0016A0 IMMED AGAIN,5,'AGAIN',DOCOLON
1214.1 000000 PUBLIC AGAIN
1214.2 0016A0 .... DW link
1214.3 0016A2 FE DB 0FEh // ; immediate
(LSB=0)
1214.4 0016A3 link SET $
1214.5 0016A3 05 DB 5
1214.6 0016A4 414741494E DB 'AGAIN'
1214.7 0016A9 00 EVEN
1214.8 0016AA IF 'DOCOLON'='DOCODE'
1214.9 0016AA AGAIN: DW $+2
1214.10 0016AA ELSE
1214.11 0016AA .... AGAIN: DW DOCOLON
1214.12 0016AC ENDIF
1214.13 0016AC ENDM
1215 0016AC ............ DW lit,bran,COMMABRANCH
1216 0016B2 ........ DW COMMADEST,EXIT
1217 0016B6
1218 0016B6 ;C WHILE adrs1 -- adrs2 adrs1
1219 0016B6 ; branch for WHILE
loop
1220 0016B6 ; POSTPONE IF SWAP ; IMMEDIATE
1221 0016B6 IMMED WHILE,5,'WHILE',DOCOLON
1221.1 000000 PUBLIC WHILE
1221.2 0016B6 .... DW link
1221.3 0016B8 FE DB 0FEh // ; immediate
(LSB=0)
1221.4 0016B9 link SET $
1221.5 0016B9 05 DB 5
1221.6 0016BA 5748494C45 DB 'WHILE'
1221.7 0016BF 00 EVEN
1221.8 0016C0 IF 'DOCOLON'='DOCODE'
1221.9 0016C0 WHILE: DW $+2
1221.10 0016C0 ELSE
1221.11 0016C0 .... WHILE: DW DOCOLON
1221.12 0016C2 ENDIF
1221.13 0016C2 ENDM
1222 0016C2 ............ DW IFF,SWAP,EXIT
1223 0016C8
1224 0016C8 ;C REPEAT adrs2 adrs1 -- resolve WHILE
loop
1225 0016C8 ; POSTPONE AGAIN POSTPONE THEN ; IMMEDIATE
1226 0016C8 IMMED REPEAT,6,'REPEAT',DOCOLON
1226.1 000000 PUBLIC REPEAT
1226.2 0016C8 .... DW link
1226.3 0016CA FE DB 0FEh // ; immediate
(LSB=0)
1226.4 0016CB link SET $
1226.5 0016CB 06 DB 6
1226.6 0016CC 524550454154 DB 'REPEAT'
1226.7 0016D2 EVEN
1226.8 0016D2 IF 'DOCOLON'='DOCODE'
1226.9 0016D2 REPEAT: DW $+2
1226.10 0016D2 ELSE
1226.11 0016D2 .... REPEAT: DW DOCOLON
1226.12 0016D4 ENDIF
1226.13 0016D4 ENDM
1227 0016D4 ............ DW AGAIN,THEN,EXIT
1228 0016DA
1229 0016DA ;Z >L x -- L: -- x move to leave
stack
1230 0016DA ; CELL LP +! LP @ ! ; (L stack grows
up)
1231 0016DA HEADER TOL,2,'>L',DOCOLON
1231.1 000000 PUBLIC TOL
1231.2 0016DA .... DW link
1231.3 0016DC FF DB 0FFh ; not immediate
1231.4 0016DD link SET $
1231.5 0016DD 02 DB 2
1231.6 0016DE 3E4C DB '>L'
1231.7 0016E0 EVEN
1231.8 0016E0 IF 'DOCOLON'='DOCODE'
1231.9 0016E0 TOL: DW $+2
1231.10 0016E0 ELSE
1231.11 0016E0 .... TOL: DW DOCOLON
1231.12 0016E2 ENDIF
1231.13 0016E2 ENDM
1232 0016E2 ............* DW CELL,LP,PLUSSTORE,LP,FETCH,STORE,EXIT
1233 0016F0
1234 0016F0 ;Z L> -- x L: x -- move from leave
stack
1235 0016F0 ; LP @ @ CELL NEGATE LP +! ;
1236 0016F0 HEADER LFROM,2,'L>',DOCOLON
1236.1 000000 PUBLIC LFROM
1236.2 0016F0 .... DW link
1236.3 0016F2 FF DB 0FFh ; not immediate
1236.4 0016F3 link SET $
1236.5 0016F3 02 DB 2
1236.6 0016F4 4C3E DB 'L>'
1236.7 0016F6 EVEN
1236.8 0016F6 IF 'DOCOLON'='DOCODE'
1236.9 0016F6 LFROM: DW $+2
1236.10 0016F6 ELSE
1236.11 0016F6 .... LFROM: DW DOCOLON
1236.12 0016F8 ENDIF
1236.13 0016F8 ENDM
1237 0016F8 ............ DW LP,FETCH,FETCH
1238 0016FE ............* DW CELL,NEGATE,LP,PLUSSTORE,EXIT
1239 001708
1240 001708 ;C DO -- adrs L: -- 0
1241 001708 ; ['] xdo ,XT IHERE target for bwd
branch
1242 001708 ; 0 >L ; IMMEDIATE marker for
LEAVEs
1243 001708 IMMED DO,2,'DO',DOCOLON
1243.1 000000 PUBLIC DO
1243.2 001708 .... DW link
1243.3 00170A FE DB 0FEh // ; immediate
(LSB=0)
1243.4 00170B link SET $
1243.5 00170B 02 DB 2
1243.6 00170C 444F DB 'DO'
1243.7 00170E EVEN
1243.8 00170E IF 'DOCOLON'='DOCODE'
1243.9 00170E DO: DW $+2
1243.10 00170E ELSE
1243.11 00170E .... DO: DW DOCOLON
1243.12 001710 ENDIF
1243.13 001710 ENDM
1244 001710 ............* DW lit,xdo,COMMAXT,IHERE
1245 001718 ....0000....* DW lit,0,TOL,EXIT
1246 001720
1247 001720 ;Z ENDLOOP adrs xt -- L: 0 a1 a2 .. aN
--
1248 001720 ; ,BRANCH ,DEST backward
loop
1249 001720 ; BEGIN L> ?DUP WHILE POSTPONE THEN REPEAT
;
1250 001720 ; resolve
LEAVEs
1251 001720 ; This is a common factor of LOOP and +LOOP.
1252 001720 HEADER ENDLOOP,7,'ENDLOOP',DOCOLON
1252.1 000000 PUBLIC ENDLOOP
1252.2 001720 .... DW link
1252.3 001722 FF DB 0FFh ; not immediate
1252.4 001723 link SET $
1252.5 001723 07 DB 7
1252.6 001724 454E444C4F4F* DB 'ENDLOOP'
1252.7 00172B 00 EVEN
1252.8 00172C IF 'DOCOLON'='DOCODE'
1252.9 00172C ENDLOOP: DW $+2
1252.10 00172C ELSE
1252.11 00172C .... ENDLOOP: DW DOCOLON
1252.12 00172E ENDIF
1252.13 00172E ENDM
1253 00172E ........ DW COMMABRANCH,COMMADEST
1254 001732 ............ LOOP1: DW LFROM,QDUP,qbran
1255 001738 DEST LOOP2
1255.1 001738 0800 DW LOOP2-$
1255.2 00173A ENDM
1256 00173A ........ DW THEN,bran
1257 00173E DEST LOOP1
1257.1 00173E F4FF DW LOOP1-$
1257.2 001740 ENDM
1258 001740 .... LOOP2: DW EXIT
1259 001742
1260 001742 ;C LOOP adrs -- L: 0 a1 a2 .. aN --
1261 001742 ; ['] xloop ENDLOOP ; IMMEDIATE
1262 001742 IMMED LOO,4,'LOOP',DOCOLON
1262.1 000000 PUBLIC LOO
1262.2 001742 .... DW link
1262.3 001744 FE DB 0FEh // ; immediate
(LSB=0)
1262.4 001745 link SET $
1262.5 001745 04 DB 4
1262.6 001746 4C4F4F50 DB 'LOOP'
1262.7 00174A EVEN
1262.8 00174A IF 'DOCOLON'='DOCODE'
1262.9 00174A LOO: DW $+2
1262.10 00174A ELSE
1262.11 00174A .... LOO: DW DOCOLON
1262.12 00174C ENDIF
1262.13 00174C ENDM
1263 00174C ............* DW lit,xloop,ENDLOOP,EXIT
1264 001754
1265 001754 ;C +LOOP adrs -- L: 0 a1 a2 .. aN --
1266 001754 ; ['] xplusloop ENDLOOP ; IMMEDIATE
1267 001754 IMMED PLUSLOOP,5,'+LOOP',DOCOLON
1267.1 000000 PUBLIC PLUSLOOP
1267.2 001754 .... DW link
1267.3 001756 FE DB 0FEh // ; immediate
(LSB=0)
1267.4 001757 link SET $
1267.5 001757 05 DB 5
1267.6 001758 2B4C4F4F50 DB '+LOOP'
1267.7 00175D 00 EVEN
1267.8 00175E IF 'DOCOLON'='DOCODE'
1267.9 00175E PLUSLOOP: DW $+2
1267.10 00175E ELSE
1267.11 00175E .... PLUSLOOP: DW DOCOLON
1267.12 001760 ENDIF
1267.13 001760 ENDM
1268 001760 ............* DW lit,xplusloop,ENDLOOP,EXIT
1269 001768
1270 001768 ;C LEAVE -- L: -- adrs
1271 001768 ; ['] UNLOOP ,XT
1272 001768 ; ['] branch ,BRANCH IHERE ,NONE >L
1273 001768 ; ; IMMEDIATE unconditional forward
branch
1274 001768 IMMED LEAV,5,'LEAVE',DOCOLON
1274.1 000000 PUBLIC LEAV
1274.2 001768 .... DW link
1274.3 00176A FE DB 0FEh // ; immediate
(LSB=0)
1274.4 00176B link SET $
1274.5 00176B 05 DB 5
1274.6 00176C 4C45415645 DB 'LEAVE'
1274.7 001771 00 EVEN
1274.8 001772 IF 'DOCOLON'='DOCODE'
1274.9 001772 LEAV: DW $+2
1274.10 001772 ELSE
1274.11 001772 .... LEAV: DW DOCOLON
1274.12 001774 ENDIF
1274.13 001774 ENDM
1275 001774 ............ DW lit,UNLOOP,COMMAXT
1276 00177A ............ DW lit,bran,COMMABRANCH
1277 001780 ............* DW IHERE,COMMANONE,TOL,EXIT
1278 001788
1279 001788 ; OTHER OPERATIONS =============================
=
1280 001788
1281 001788 ;X WITHIN n1|u1 n2|u2 n3|u3 -- f n2<=n1R - R> U< ; per ANS
document
1283 001788 HEADER WITHIN,6,'WITHIN',DOCOLON
1283.1 000000 PUBLIC WITHIN
1283.2 001788 .... DW link
1283.3 00178A FF DB 0FFh ; not immediate
1283.4 00178B link SET $
1283.5 00178B 06 DB 6
1283.6 00178C 57495448494E DB 'WITHIN'
1283.7 001792 EVEN
1283.8 001792 IF 'DOCOLON'='DOCODE'
1283.9 001792 WITHIN: DW $+2
1283.10 001792 ELSE
1283.11 001792 .... WITHIN: DW DOCOLON
1283.12 001794 ENDIF
1283.13 001794 ENDM
1284 001794 ............* DW OVER,MINUS,TOR,MINUS,RFROM,ULESS,EXIT
1285 0017A2
1286 0017A2 ;C MOVE addr1 addr2 u -- smart move
1287 0017A2 ; VERSION FOR 1 ADDRESS UNIT = 1
CHAR
1288 0017A2 ; >R 2DUP SWAP DUP R@ + -- ... dst src
src+n
1289 0017A2 ; WITHIN IF R> CMOVE> src <= dst <
src+n
1290 0017A2 ; ELSE R> CMOVE THEN ;
otherwise
1291 0017A2 HEADER MOVE,4,'MOVE',DOCOLON
1291.1 000000 PUBLIC MOVE
1291.2 0017A2 .... DW link
1291.3 0017A4 FF DB 0FFh ; not immediate
1291.4 0017A5 link SET $
1291.5 0017A5 04 DB 4
1291.6 0017A6 4D4F5645 DB 'MOVE'
1291.7 0017AA EVEN
1291.8 0017AA IF 'DOCOLON'='DOCODE'
1291.9 0017AA MOVE: DW $+2
1291.10 0017AA ELSE
1291.11 0017AA .... MOVE: DW DOCOLON
1291.12 0017AC ENDIF
1291.13 0017AC ENDM
1292 0017AC ............* DW TOR,TWODUP,SWAP,DUP,RFETCH,PLUS
1293 0017B8 ........ DW WITHIN,qbran
1294 0017BC DEST MOVE1
1294.1 0017BC 0A00 DW MOVE1-$
1294.2 0017BE ENDM
1295 0017BE ............ DW RFROM,CMOVEUP,bran
1296 0017C4 DEST MOVE2
1296.1 0017C4 0600 DW MOVE2-$
1296.2 0017C6 ENDM
1297 0017C6 ........ MOVE1: DW RFROM,CMOVE
1298 0017CA .... MOVE2: DW EXIT
1299 0017CC
1300 0017CC ;C DEPTH -- +n number of items on
stack
1301 0017CC ; SP@ S0 SWAP - 2/ ; 16-BIT VERSION!
1302 0017CC HEADER DEPTH,5,'DEPTH',DOCOLON
1302.1 000000 PUBLIC DEPTH
1302.2 0017CC .... DW link
1302.3 0017CE FF DB 0FFh ; not immediate
1302.4 0017CF link SET $
1302.5 0017CF 05 DB 5
1302.6 0017D0 4445505448 DB 'DEPTH'
1302.7 0017D5 00 EVEN
1302.8 0017D6 IF 'DOCOLON'='DOCODE'
1302.9 0017D6 DEPTH: DW $+2
1302.10 0017D6 ELSE
1302.11 0017D6 .... DEPTH: DW DOCOLON
1302.12 0017D8 ENDIF
1302.13 0017D8 ENDM
1303 0017D8 ............* DW SPFETCH,S0,SWAP,MINUS,TWOSLASH,EXIT
1304 0017E4
1305 0017E4 ;C ENVIRONMENT? c-addr u -- false system
query
1306 0017E4 ; -- i*x true
1307 0017E4 ; 2DROP 0 ; the minimal definition!
1308 0017E4 HEADER ENVIRONMENTQ,12,'ENVIRONMENT?',DOCOL
ON
1308.1 000000 PUBLIC ENVIRONMENTQ
1308.2 0017E4 .... DW link
1308.3 0017E6 FF DB 0FFh ; not immediate
1308.4 0017E7 link SET $
1308.5 0017E7 0C DB 12
1308.6 0017E8 454E5649524F* DB 'ENVIRONMENT?'
1308.7 0017F4 EVEN
1308.8 0017F4 IF 'DOCOLON'='DOCODE'
1308.9 0017F4 ENVIRONMENTQ: DW $+2
1308.10 0017F4 ELSE
1308.11 0017F4 .... ENVIRONMENTQ: DW DOCOLON
1308.12 0017F6 ENDIF
1308.13 0017F6 ENDM
1309 0017F6 ........0000* DW TWODROP,lit,0,EXIT
1310 0017FE
1311 0017FE ;U UTILITY WORDS =====================
1312 0017FE
1313 0017FE ;Z NOOP -- do nothing
1314 0017FE HEADER NOOP,4,'NOOP',DOCOLON
1314.1 000000 PUBLIC NOOP
1314.2 0017FE .... DW link
1314.3 001800 FF DB 0FFh ; not immediate
1314.4 001801 link SET $
1314.5 001801 04 DB 4
1314.6 001802 4E4F4F50 DB 'NOOP'
1314.7 001806 EVEN
1314.8 001806 IF 'DOCOLON'='DOCODE'
1314.9 001806 NOOP: DW $+2
1314.10 001806 ELSE
1314.11 001806 .... NOOP: DW DOCOLON
1314.12 001808 ENDIF
1314.13 001808 ENDM
1315 001808 .... DW EXIT
1316 00180A
1317 00180A ;Z FLALIGNED a -- a' align IDP to flash
boundary
1318 00180A ; $200 OVER - $1FF AND + ;
1319 00180A HEADER FLALIGNED,9,'FLALIGNED',DOCOLON
1319.1 000000 PUBLIC FLALIGNED
1319.2 00180A .... DW link
1319.3 00180C FF DB 0FFh ; not immediate
1319.4 00180D link SET $
1319.5 00180D 09 DB 9
1319.6 00180E 464C414C4947* DB 'FLALIGNED'
1319.7 001817 00 EVEN
1319.8 001818 IF 'DOCOLON'='DOCODE'
1319.9 001818 FLALIGNED: DW $+2
1319.10 001818 ELSE
1319.11 001818 .... FLALIGNED: DW DOCOLON
1319.12 00181A ENDIF
1319.13 00181A ENDM
1320 00181A ....0002....* DW lit,0200h,OVER,MINUS,lit,01FFh,ANDD,P
LUS,EXIT
1321 00182C
1322 00182C ;X MARKER -- create word to restore
dictionary
1323 00182C ; LATEST @ IHERE HERE
1324 00182C ; IHERE FLALIGNED IDP ! align new word to
flash boundary
1325 00182C ; DUP I@
1327 00182C ; SWAP CELL+ DUP I@
1328 00182C ; SWAP CELL+ I@ fetch saved -- dp
idp latest
1329 00182C ; OVER FLALIGNED IHERE OVER - FLERASE erase
Flash from saved to IHERE
1330 00182C ; LATEST ! IDP ! DP ! ;
1331 00182C HEADER MARKER,6,'MARKER',DOCOLON
1331.1 000000 PUBLIC MARKER
1331.2 00182C .... DW link
1331.3 00182E FF DB 0FFh ; not immediate
1331.4 00182F link SET $
1331.5 00182F 06 DB 6
1331.6 001830 4D41524B4552 DB 'MARKER'
1331.7 001836 EVEN
1331.8 001836 IF 'DOCOLON'='DOCODE'
1331.9 001836 MARKER: DW $+2
1331.10 001836 ELSE
1331.11 001836 .... MARKER: DW DOCOLON
1331.12 001838 ENDIF
1331.13 001838 ENDM
1332 001838 ............* DW LATEST,FETCH,IHERE,HERE
1333 001840 ............* DW IHERE,FLALIGNED,IDP,STORE
1334 001848 ............* DW BUILDS,ICOMMA,ICOMMA,ICOMMA,XDOES
1335 001852 3040.... MOV #dodoes,PC ; long direct jump
to DODOES
1336 001856 ........ DW DUP,IFETCH
1337 00185A ............* DW SWAP,CELLPLUS,DUP,IFETCH
1338 001862 ............ DW SWAP,CELLPLUS,IFETCH
1339 001868 ............* DW OVER,FLALIGNED,IHERE,OVER,MINUS,FLERA
SE
1340 001874 ............* DW LATEST,STORE,IDP,STORE,DDP,STORE,EXIT
1341 001882
1342 001882 ;X WORDS -- list all words in
dict.
1343 001882 ; LATEST @ BEGIN
1344 001882 ; DUP HCOUNT 7F AND HTYPE SPACE
1345 001882 ; NFA>LFA H@
1346 001882 ; DUP 0= UNTIL
1347 001882 ; DROP ;
1348 001882 HEADER WORDS,5,'WORDS',DOCOLON
1348.1 000000 PUBLIC WORDS
1348.2 001882 .... DW link
1348.3 001884 FF DB 0FFh ; not immediate
1348.4 001885 link SET $
1348.5 001885 05 DB 5
1348.6 001886 574F524453 DB 'WORDS'
1348.7 00188B 00 EVEN
1348.8 00188C IF 'DOCOLON'='DOCODE'
1348.9 00188C WORDS: DW $+2
1348.10 00188C ELSE
1348.11 00188C .... WORDS: DW DOCOLON
1348.12 00188E ENDIF
1348.13 00188E ENDM
1349 00188E ........ DW LATEST,FETCH
1350 001892 ............*WDS1: DW DUP,HCOUNT,lit,07FH,ANDD,HTYPE,SPACE
1351 0018A0 ........ DW NFATOLFA,HFETCH
1352 0018A4 ............ DW DUP,ZEROEQUAL,qbran
1353 0018AA DEST WDS1
1353.1 0018AA E8FF DW WDS1-$
1353.2 0018AC ENDM
1354 0018AC ........ DW DROP,EXIT
1355 0018B0
1356 0018B0 ;X U.R u n -- display u unsigned in
n width
1357 0018B0 ; >R <# 0 #S #> R> OVER - 0 MAX SPACES TYPE
;
1358 0018B0 HEADER UDOTR,3,'U.R',DOCOLON
1358.1 000000 PUBLIC UDOTR
1358.2 0018B0 .... DW link
1358.3 0018B2 FF DB 0FFh ; not immediate
1358.4 0018B3 link SET $
1358.5 0018B3 03 DB 3
1358.6 0018B4 552E52 DB 'U.R'
1358.7 0018B7 00 EVEN
1358.8 0018B8 IF 'DOCOLON'='DOCODE'
1358.9 0018B8 UDOTR: DW $+2
1358.10 0018B8 ELSE
1358.11 0018B8 .... UDOTR: DW DOCOLON
1358.12 0018BA ENDIF
1358.13 0018BA ENDM
1359 0018BA ............* DW TOR,LESSNUM,lit,0,NUMS,NUMGREATER
1360 0018C6 ............* DW RFROM,OVER,MINUS,lit,0,MAX,SPACES,TYP
,EXIT
1361 0018D8
1362 0018D8 ;X DUMP adr n -- dump memory
1363 0018D8 ; OVER + SWAP DO
1364 0018D8 ; CR I 4 U.R SPACE SPACE
1365 0018D8 ; I $10 + I DO I C@ 3 U.R LOOP SPACE
SPACE
1366 0018D8 ; I $10 + I DO I C@ $7F AND $7E MIN BL MAX
EMIT LOOP
1367 0018D8 ; 10 +LOOP ;
1368 0018D8 HEADER DUMP,4,'DUMP',DOCOLON
1368.1 000000 PUBLIC DUMP
1368.2 0018D8 .... DW link
1368.3 0018DA FF DB 0FFh ; not immediate
1368.4 0018DB link SET $
1368.5 0018DB 04 DB 4
1368.6 0018DC 44554D50 DB 'DUMP'
1368.7 0018E0 EVEN
1368.8 0018E0 IF 'DOCOLON'='DOCODE'
1368.9 0018E0 DUMP: DW $+2
1368.10 0018E0 ELSE
1368.11 0018E0 .... DUMP: DW DOCOLON
1368.12 0018E2 ENDIF
1368.13 0018E2 ENDM
1369 0018E2 ............* DW OVER,PLUS,SWAP,xdo
1370 0018EA ............*LDUMP1: DW CR,II,lit,4,UDOTR,SPACE,SPACE
1371 0018F8 ........1000* DW II,lit,10h,PLUS,II,xdo
1372 001904 ............*LDUMP2: DW II,CFETCH,lit,3,UDOTR,xloop
1373 001910 DEST LDUMP2
1373.1 001910 F4FF DW LDUMP2-$
1373.2 001912 ENDM
1374 001912 ........ DW SPACE,SPACE
1375 001916 ........1000* DW II,lit,10h,PLUS,II,xdo
1376 001922 ............*LDUMP3: DW II,CFETCH,lit,7Fh,ANDD,lit,7Eh,MIN,BL
ANK,MAX,EMIT,xloop
1377 00193A DEST LDUMP3
1377.1 00193A E8FF DW LDUMP3-$
1377.2 00193C ENDM
1378 00193C ....1000.... DW lit,10h,xplusloop
1379 001942 DEST LDUMP1
1379.1 001942 A8FF DW LDUMP1-$
1379.2 001944 ENDM
1380 001944 .... DW EXIT
1381 001946
1382 001946 ;X .S -- print stack contents
1383 001946 ; [char] < EMIT DEPTH . BS [char] > EMIT
1384 001946 ; SP@ S0 < IF
1385 001946 ; SP@ S0 2 - DO I @ U. -2 +LOOP
1386 001946 ; THEN ;
1387 001946 HEADER DOTS,2,'.S',DOCOLON
1387.1 000000 PUBLIC DOTS
1387.2 001946 .... DW link
1387.3 001948 FF DB 0FFh ; not immediate
1387.4 001949 link SET $
1387.5 001949 02 DB 2
1387.6 00194A 2E53 DB '.S'
1387.7 00194C EVEN
1387.8 00194C IF 'DOCOLON'='DOCODE'
1387.9 00194C DOTS: DW $+2
1387.10 00194C ELSE
1387.11 00194C .... DOTS: DW DOCOLON
1387.12 00194E ENDIF
1387.13 00194E ENDM
1388 00194E ;mk gforth style
1389 00194E ....3C00.... DW lit,$3C,EMIT
1390 001954 ........ DW DEPTH,DOT
1391 001958 ....0800....* DW lit,$08,EMIT,lit,$3E,EMIT,SPACE
1392 001966 ;/mk
1393 001966 ............* DW SPFETCH,S0,LESS,qbran
1394 00196E DEST DOTS2
1394.1 00196E 1C00 DW DOTS2-$
1394.2 001970 ENDM
1395 001970 ............* DW SPFETCH,S0,lit,2,MINUS,xdo
1396 00197C ............*DOTS1: DW II,FETCH,UDOT,lit,-2,xplusloop
1397 001988 DEST DOTS1
1397.1 001988 F4FF DW DOTS1-$
1397.2 00198A ENDM
1398 00198A .... DOTS2: DW EXIT
1399 00198C
1400 00198C
1401 00198C ;U ccrc n c -- n' crc process
byte
1402 00198C ; 8 LSHIFT XOR
1403 00198C ; 8 0 DO ( n' )
1404 00198C ; DUP 1 LSHIFT SWAP 8000 AND 0= INVERT 1021
( CRC-16 ) AND XOR
1405 00198C ; LOOP
1406 00198C ; FFFF AND ;
1407 00198C HEADER CCRC,4,'ccrc',DOCOLON
1407.1 000000 PUBLIC CCRC
1407.2 00198C .... DW link
1407.3 00198E FF DB 0FFh ; not immediate
1407.4 00198F link SET $
1407.5 00198F 04 DB 4
1407.6 001990 63637263 DB 'ccrc'
1407.7 001994 EVEN
1407.8 001994 IF 'DOCOLON'='DOCODE'
1407.9 001994 CCRC: DW $+2
1407.10 001994 ELSE
1407.11 001994 .... CCRC: DW DOCOLON
1407.12 001996 ENDIF
1407.13 001996 ENDM
1408 001996 ....0800....* DW lit,8,LSHIFT,XORR
1409 00199E ....0800....* DW lit,8,lit,0,xdo
1410 0019A8 ........0100*ccrc1: DW DUP,lit,1,LSHIFT,SWAP,lit,08000h,AN
DD,ZEROEQUAL
1411 0019BA ........2110* DW INVERT,lit,01021h,ANDD,XORR
1412 0019C4 .... DW xloop
1413 0019C6 DEST ccrc1
1413.1 0019C6 E2FF DW ccrc1-$
1413.2 0019C8 ENDM
1414 0019C8 .... DW EXIT
1415 0019CA
1416 0019CA ;U (crc n addr len -- n' crc process
string
1417 0019CA ; dup IF over + swap DO ( n ) I C@ ccrc LOOP
ELSE 2drop THEN ;
1418 0019CA HEADER PCRC,4,'(crc',DOCOLON
1418.1 000000 PUBLIC PCRC
1418.2 0019CA .... DW link
1418.3 0019CC FF DB 0FFh ; not immediate
1418.4 0019CD link SET $
1418.5 0019CD 04 DB 4
1418.6 0019CE 28637263 DB '(crc'
1418.7 0019D2 EVEN
1418.8 0019D2 IF 'DOCOLON'='DOCODE'
1418.9 0019D2 PCRC: DW $+2
1418.10 0019D2 ELSE
1418.11 0019D2 .... PCRC: DW DOCOLON
1418.12 0019D4 ENDIF
1418.13 0019D4 ENDM
1419 0019D4 ........ DW DUP,qbran
1420 0019D8 DEST pcrc2
1420.1 0019D8 1800 DW pcrc2-$
1420.2 0019DA ENDM
1421 0019DA ............* DW OVER,PLUS,SWAP,xdo
1422 0019E2 ............*pcrc1: DW II,CFETCH,CCRC, xloop
1423 0019EA DEST pcrc1
1423.1 0019EA F8FF DW pcrc1-$
1423.2 0019EC ENDM
1424 0019EC .... DW bran
1425 0019EE DEST pcrc3
1425.1 0019EE 0400 DW pcrc3-$
1425.2 0019F0 ENDM
1426 0019F0 .... pcrc2: DW TWODROP
1427 0019F2 .... pcrc3: DW EXIT
1428 0019F4
1429 0019F4 ;U crc addr len -- n
1430 0019F4 HEADER CRC,3,'crc',DOCOLON
1430.1 000000 PUBLIC CRC
1430.2 0019F4 .... DW link
1430.3 0019F6 FF DB 0FFh ; not immediate
1430.4 0019F7 link SET $
1430.5 0019F7 03 DB 3
1430.6 0019F8 637263 DB 'crc'
1430.7 0019FB 00 EVEN
1430.8 0019FC IF 'DOCOLON'='DOCODE'
1430.9 0019FC CRC: DW $+2
1430.10 0019FC ELSE
1430.11 0019FC .... CRC: DW DOCOLON
1430.12 0019FE ENDIF
1430.13 0019FE ENDM
1431 0019FE ....0000....* DW lit,0,ROT,ROT,PCRC,EXIT
1432 001A0A
1433 001A0A
1434 001A0A ;U STARTUP WORDS ===============================
================================
1435 001A0A
1436 001A0A ;Z ITHERE -- adr find first free flash
cell
1437 001A0A ; MEMTOP BEGIN 1-
1438 001A0A ; DUP C@ FF <>
1439 001A0A ; OVER FL0 < OR UNTIL 1+ ;
1440 001A0A HEADER ITHERE,6,'ITHERE',DOCOLON
1440.1 000000 PUBLIC ITHERE
1440.2 001A0A .... DW link
1440.3 001A0C FF DB 0FFh ; not immediate
1440.4 001A0D link SET $
1440.5 001A0D 06 DB 6
1440.6 001A0E 495448455245 DB 'ITHERE'
1440.7 001A14 EVEN
1440.8 001A14 IF 'DOCOLON'='DOCODE'
1440.9 001A14 ITHERE: DW $+2
1440.10 001A14 ELSE
1440.11 001A14 .... ITHERE: DW DOCOLON
1440.12 001A16 ENDIF
1440.13 001A16 ENDM
1441 001A16 .... DW MEMTOP
1442 001A18 ............*ih1 DW ONEMINUS,DUP,CFETCH,lit,$FF,NOTEQUAL
1443 001A24 ........00C0* DW OVER,lit,FLASHSTART,LESS,ORR,qbran
1444 001A30 DEST ih1
1444.1 001A30 E8FF DW ih1-$
1444.2 001A32 ENDM
1445 001A32 ........ DW ONEPLUS,EXIT
1446 001A36
1447 001A36 ;U APPCRC -- crc CRC of APP-dictionary
1448 001A36 ; 0 MEMBOT ITHERE OVER - (crc APPU0 #INIT
(crc ;
1449 001A36 HEADER APPCRC,6,'APPCRC',DOCOLON
1449.1 000000 PUBLIC APPCRC
1449.2 001A36 .... DW link
1449.3 001A38 FF DB 0FFh ; not immediate
1449.4 001A39 link SET $
1449.5 001A39 06 DB 6
1449.6 001A3A 415050435243 DB 'APPCRC'
1449.7 001A40 EVEN
1449.8 001A40 IF 'DOCOLON'='DOCODE'
1449.9 001A40 APPCRC: DW $+2
1449.10 001A40 ELSE
1449.11 001A40 .... APPCRC: DW DOCOLON
1449.12 001A42 ENDIF
1449.13 001A42 ENDM
1450 001A42 ....0000 DW lit,0
1451 001A46 ....00C0....* DW lit,FLASHSTART,ITHERE,OVER,MINUS,PCRC
1452 001A52 ............* DW APPU0,NINIT,PCRC,EXIT
1453 001A5A
1454 000000 EXTERN crcval
1455 001A5A
1456 001A5A ;U VALID? -- f check if user app crc
matches infoB
1457 001A5A ; APPCRC crcval I@ = ;
1458 001A5A HEADER VALIDQ,6,'VALID?',DOCOLON
1458.1 000000 PUBLIC VALIDQ
1458.2 001A5A .... DW link
1458.3 001A5C FF DB 0FFh ; not immediate
1458.4 001A5D link SET $
1458.5 001A5D 06 DB 6
1458.6 001A5E 56414C49443F DB 'VALID?'
1458.7 001A64 EVEN
1458.8 001A64 IF 'DOCOLON'='DOCODE'
1458.9 001A64 VALIDQ: DW $+2
1458.10 001A64 ELSE
1458.11 001A64 .... VALIDQ: DW DOCOLON
1458.12 001A66 ENDIF
1458.13 001A66 ENDM
1459 001A66 ............* DW APPCRC,lit,crcval,IFETCH,EQUAL,EXIT
1460 001A72
1461 001A72 ;U SAVE -- save user area to infoB
1462 001A72 ; InfoB [ 63 2 + ] Literal FLERASE
1463 001A72 ; U0 APPU0 #INIT D->I
1464 001A72 ; APPCRC [ crcval ] Literal I! ;
1465 001A72 HEADER SAVE,4,'SAVE',DOCOLON
1465.1 000000 PUBLIC SAVE
1465.2 001A72 .... DW link
1465.3 001A74 FF DB 0FFh ; not immediate
1465.4 001A75 link SET $
1465.5 001A75 04 DB 4
1465.6 001A76 53415645 DB 'SAVE'
1465.7 001A7A EVEN
1465.8 001A7A IF 'DOCOLON'='DOCODE'
1465.9 001A7A SAVE: DW $+2
1465.10 001A7A ELSE
1465.11 001A7A .... SAVE: DW DOCOLON
1465.12 001A7C ENDIF
1465.13 001A7C ENDM
1466 001A7C ........4100* DW INFOB,lit,63+2,FLERASE
1467 001A84 ............* DW U0,APPU0,NINIT,DTOI
1468 001A8C ............* DW APPCRC,lit,crcval,ISTORE
1469 001A94 .... DW EXIT
1470 001A96
1471 00018E CORREST EQU 018Eh
1472 000186 CORPOWERON EQU 0186h
1473 001A96
1474 001A96 ;Z BOOT -- boot system
1475 001A96 HEADER BOOT,4,'BOOT',DOCOLON
1475.1 000000 PUBLIC BOOT
1475.2 001A96 .... DW link
1475.3 001A98 FF DB 0FFh ; not immediate
1475.4 001A99 link SET $
1475.5 001A99 04 DB 4
1475.6 001A9A 424F4F54 DB 'BOOT'
1475.7 001A9E EVEN
1475.8 001A9E IF 'DOCOLON'='DOCODE'
1475.9 001A9E BOOT: DW $+2
1475.10 001A9E ELSE
1475.11 001A9E .... BOOT: DW DOCOLON
1475.12 001AA0 ENDIF
1475.13 001AA0 ENDM
1476 001AA0 .... DW DOTVER
1477 001AA2 ............ DW S2,cget,qbran
1478 001AA8 DEST boot1
1478.1 001AA8 2A00 DW boot1-$
1478.2 001AAA ENDM
1479 001AAA ........ DW VALIDQ,qbran
1480 001AAE DEST invalid
1480.1 001AAE 0400 DW invalid-$
1480.2 001AB0 ENDM
1481 001AB0 .... valid: DW COLD ; valid infoB and dictionary
1482 001AB2 ............*invalid:DW COR,FETCH,lit,CORPOWERON,NOTEQUAL,qbr
an
1483 001ABE DEST boot1
1483.1 001ABE 1400 DW boot1-$
1483.2 001AC0 ENDM
1484 001AC0 reset: ; reset and invalid infoB
1485 001AC0 ............* DW LATEST,FETCH,lit,FLASHSTART,ITHERE,WI
THIN,qbran ; check RAM latest
1486 001ACE DEST boot1
1486.1 001ACE 0400 DW boot1-$
1486.2 001AD0 ENDM
1487 001AD0 .... DW WARM ; invalid infoB but seemingly
valid RAM
1488 001AD2 .... boot1: DW WIPE ; invalid infoB but power on
or RAM invalid
1489 001AD4
1490 000000 PUBLIC BOOTIP ; used to init IP register.
1491 001AD4 BOOTIP equ BOOT+2
1492 001AD4
1493 001AD4 ;Z WARM -- use user area from RAM
(hopefully intact)
1494 001AD4 HEADER WARM,4,'WARM',DOCOLON
1494.1 000000 PUBLIC WARM
1494.2 001AD4 .... DW link
1494.3 001AD6 FF DB 0FFh ; not immediate
1494.4 001AD7 link SET $
1494.5 001AD7 04 DB 4
1494.6 001AD8 5741524D DB 'WARM'
1494.7 001ADC EVEN
1494.8 001ADC IF 'DOCOLON'='DOCODE'
1494.9 001ADC WARM: DW $+2
1494.10 001ADC ELSE
1494.11 001ADC .... WARM: DW DOCOLON
1494.12 001ADE ENDIF
1494.13 001ADE ENDM
1495 001ADE .... DW XISQUOTE
1496 001AE0 05 DB (warm1-warm0)
1497 001AE1 5761726D warm0: DB 'Warm'
1498 001AE5 00 EVEN
1499 001AE6 .... warm1: DW ITYPE
1500 001AE8 .... DW ABORT
1501 001AEA
1502 001AEA ;U .COLD -- display COLD message
1503 001AEA HEADLESS DOTCOLD,DOCOLON
1503.1 000000 PUBLIC DOTCOLD
1503.2 001AEA IF 'DOCOLON'='DOCODE'
1503.3 001AEA DOTCOLD: DW $+2
1503.4 001AEA ELSE
1503.5 001AEA .... DOTCOLD: DW DOCOLON
1503.6 001AEC ENDIF
1503.7 001AEC ENDM
1504 001AEC .... DW XISQUOTE
1505 001AEE 05 DB (dotcold1-dotcold0)
1506 001AEF 436F6C64 dotcold0:DB 'Cold'
1507 001AF3 00 EVEN
1508 001AF4 .... dotcold1:DW ITYPE
1509 001AF6 .... DW EXIT
1510 001AF8
1511 001AF8 PUBLIC DOTCOLD
1512 001AF8
1513 001AF8 ;Z COLD -- set user area to latest
application
1514 001AF8 HEADER COLD,4,'COLD',DOCOLON
1514.1 000000 PUBLIC COLD
1514.2 001AF8 .... DW link
1514.3 001AFA FF DB 0FFh ; not immediate
1514.4 001AFB link SET $
1514.5 001AFB 04 DB 4
1514.6 001AFC 434F4C44 DB 'COLD'
1514.7 001B00 EVEN
1514.8 001B00 IF 'DOCOLON'='DOCODE'
1514.9 001B00 COLD: DW $+2
1514.10 001B00 ELSE
1514.11 001B00 .... COLD: DW DOCOLON
1514.12 001B02 ENDIF
1514.13 001B02 ENDM
1515 001B02 ............* DW APPU0,U0,NINIT,ITOD ; use application
user area
1516 001B0A ............ DW APP,FETCH,EXECUTE ; AUTOSTART
Application
1517 001B10 .... DW ABORT
1518 001B12
1519 001B12 ;Z FACTORY -- set user area to delivery
condition
1520 001B12 ; UINIT U0 #INIT I->D SAVE init user
area
1521 001B12 ; ABORT ;
1522 001B12 HEADER FACTORY,7,'FACTORY',DOCOLON
1522.1 000000 PUBLIC FACTORY
1522.2 001B12 .... DW link
1522.3 001B14 FF DB 0FFh ; not immediate
1522.4 001B15 link SET $
1522.5 001B15 07 DB 7
1522.6 001B16 464143544F52* DB 'FACTORY'
1522.7 001B1D 00 EVEN
1522.8 001B1E IF 'DOCOLON'='DOCODE'
1522.9 001B1E FACTORY: DW $+2
1522.10 001B1E ELSE
1522.11 001B1E .... FACTORY: DW DOCOLON
1522.12 001B20 ENDIF
1522.13 001B20 ENDM
1523 001B20 ............* DW UINIT,U0,NINIT,ITOD ; use kernel
user
area
1524 001B28 .... DW SAVE
1525 001B2A .... DW ABORT ; ABORT never returns
1526 001B2C
1527 000000 PUBLIC FACTORYIP ; used to init IP register.
1528 001B2C FACTORYIP equ FACTORY+2
1529 001B2C
1530 001B2C ;U WIPE -- erase flash but not kernel,
reset user area.
1531 001B2C HEADER WIPE,4,'WIPE',DOCOLON
1531.1 000000 PUBLIC WIPE
1531.2 001B2C .... DW link
1531.3 001B2E FF DB 0FFh ; not immediate
1531.4 001B2F link SET $
1531.5 001B2F 04 DB 4
1531.6 001B30 57495045 DB 'WIPE'
1531.7 001B34 EVEN
1531.8 001B34 IF 'DOCOLON'='DOCODE'
1531.9 001B34 WIPE: DW $+2
1531.10 001B34 ELSE
1531.11 001B34 .... WIPE: DW DOCOLON
1531.12 001B36 ENDIF
1531.13 001B36 ENDM
1532 001B36 .... DW XISQUOTE
1533 001B38 07 DB (wipmsg1-wipmsg0)
1534 001B39 576970696E67 wipmsg0:DB 'Wiping'
1535 001B3F 00 EVEN
1536 001B40 .... wipmsg1:DW ITYPE
1537 001B42 ....00C0....* DW lit,FLASHSTART,lit,FLASHEND-FLASHSTAR
T+1,FLERASE
1538 001B4C .... DW FACTORY ; EXIT
1539 001B4E
1540 001B4E ;U MISC ========================================
================================
1541 001B4E
1542 001B4E ;C 2CONSTANT -- define a Forth
double constant
1543 001B4E ; (machine code fragment)
1545 001B4E ; Note that the constant is stored in Code
space.
1546 001B4E HEADER TWOCONSTANT,9,'2CONSTANT',DOCOLON
1546.1 000000 PUBLIC TWOCONSTANT
1546.2 001B4E .... DW link
1546.3 001B50 FF DB 0FFh ; not immediate
1546.4 001B51 link SET $
1546.5 001B51 09 DB 9
1546.6 001B52 32434F4E5354* DB '2CONSTANT'
1546.7 001B5B 00 EVEN
1546.8 001B5C IF 'DOCOLON'='DOCODE'
1546.9 001B5C TWOCONSTANT: DW $+2
1546.10 001B5C ELSE
1546.11 001B5C .... TWOCONSTANT: DW DOCOLON
1546.12 001B5E ENDIF
1546.13 001B5E ENDM
1547 001B5E ............* DW BUILDS,ICOMMA,ICOMMA,XDOES
1548 000000 PUBLIC DOTWOCON
1549 001B66 DOTWOCON: ; ( -- w1 w2 )
1550 001B66 2482 SUB #4,PSP ; make room on stack
1551 001B68 84470200 MOV TOS,2(PSP)
1552 001B6C 3746 MOV @W+,TOS ; fetch from parameter
field to TOS
1553 001B6E A4460000 MOV @W,0(PSP) ; fetch secon word from
parameter field to
NOS
1554 001B72 NEXT
1554.1 001B72 3645 MOV @IP+,W // ; fetch word address
into W
1554.2 001B74 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
1554.3 001B76 ENDM
1555 001B76
1556 001B76 ;U \ -- backslash
1557 001B76 ; everything up to the end of the current line
is a comment.
1558 001B76 ; SOURCE >IN ! DROP ;
1559 001B76 IMMED BACKSLASH,1,'\\',DOCOLON
1559.1 000000 PUBLIC BACKSLASH
1559.2 001B76 .... DW link
1559.3 001B78 FE DB 0FEh // ; immediate
(LSB=0)
1559.4 001B79 link SET $
1559.5 001B79 01 DB 1
1559.6 001B7A 5C DB '\\'
1559.7 001B7B 00 EVEN
1559.8 001B7C IF 'DOCOLON'='DOCODE'
1559.9 001B7C BACKSLASH: DW $+2
1559.10 001B7C ELSE
1559.11 001B7C .... BACKSLASH: DW DOCOLON
1559.12 001B7E ENDIF
1559.13 001B7E ENDM
1560 001B7E ............* DW SOURCE,TOIN,STORE,DROP,EXIT
1561 001B88
1562 001B88 ;Z .VER -- type message
1563 001B88 HEADER DOTVER,4,'.VER',DOCOLON
1563.1 000000 PUBLIC DOTVER
1563.2 001B88 .... DW link
1563.3 001B8A FF DB 0FFh ; not immediate
1563.4 001B8B link SET $
1563.5 001B8B 04 DB 4
1563.6 001B8C 2E564552 DB '.VER'
1563.7 001B90 EVEN
1563.8 001B90 IF 'DOCOLON'='DOCODE'
1563.9 001B90 DOTVER: DW $+2
1563.10 001B90 ELSE
1563.11 001B90 .... DOTVER: DW DOCOLON
1563.12 001B92 ENDIF
1563.13 001B92 ENDM
1564 001B92 ............* DW lit,version,COUNT,ITYPE
1565 001B9A ............ DW BASE,FETCH,BIN
1566 001BA0 ............ DW COR,FETCH,DOT
1567 001BA6 ........ DW BASE,STORE
1568 001BAA .... DW EXIT ; print cause of reset
1569 001BAC
1570 001BAC ;U BELL -- send $07 to
Terminal
1571 001BAC HEADER BELL,4,'BELL',DOCOLON
1571.1 000000 PUBLIC BELL
1571.2 001BAC .... DW link
1571.3 001BAE FF DB 0FFh ; not immediate
1571.4 001BAF link SET $
1571.5 001BAF 04 DB 4
1571.6 001BB0 42454C4C DB 'BELL'
1571.7 001BB4 EVEN
1571.8 001BB4 IF 'DOCOLON'='DOCODE'
1571.9 001BB4 BELL: DW $+2
1571.10 001BB4 ELSE
1571.11 001BB4 .... BELL: DW DOCOLON
1571.12 001BB6 ENDIF
1571.13 001BB6 ENDM
1572 001BB6 ....0700....* DW lit,7,EMIT,EXIT
1573 001BBE
1574 001BBE ;U BIN -- set number base to
binary
1575 001BBE HEADER BIN,3,'BIN',DOCOLON
1575.1 000000 PUBLIC BIN
1575.2 001BBE .... DW link
1575.3 001BC0 FF DB 0FFh ; not immediate
1575.4 001BC1 link SET $
1575.5 001BC1 03 DB 3
1575.6 001BC2 42494E DB 'BIN'
1575.7 001BC5 00 EVEN
1575.8 001BC6 IF 'DOCOLON'='DOCODE'
1575.9 001BC6 BIN: DW $+2
1575.10 001BC6 ELSE
1575.11 001BC6 .... BIN: DW DOCOLON
1575.12 001BC8 ENDIF
1575.13 001BC8 ENDM
1576 001BC8 ....0200....* DW lit,2,BASE,STORE,EXIT
1577 001BD2
1578 001BD2
1579 001BD2
1580 001BD2 ;U MCU specific words ==========================
================================
1581 001BD2
1582 001BD2 ;U 1MS -- wait about 1 millisecond
1583 001BD2 ; xx 0 DO yy 0 DO LOOP LOOP ; adjust xx and yy
to get a msec.
1584 001BD2 HEADER ONEMS,3,'1MS',DOCOLON
1584.1 000000 PUBLIC ONEMS
1584.2 001BD2 .... DW link
1584.3 001BD4 FF DB 0FFh ; not immediate
1584.4 001BD5 link SET $
1584.5 001BD5 03 DB 3
1584.6 001BD6 314D53 DB '1MS'
1584.7 001BD9 00 EVEN
1584.8 001BDA IF 'DOCOLON'='DOCODE'
1584.9 001BDA ONEMS: DW $+2
1584.10 001BDA ELSE
1584.11 001BDA .... ONEMS: DW DOCOLON
1584.12 001BDC ENDIF
1584.13 001BDC ENDM
1585 001BDC ....2900....* DW lit,41,lit,0,xdo
1586 001BE6 ....0B00....*onems1: DW lit,11,lit,0,xdo
1587 001BF0 .... onems2: DW xloop
1588 001BF2 DEST onems2
1588.1 001BF2 FEFF DW onems2-$
1588.2 001BF4 ENDM
1589 001BF4 .... DW xloop
1590 001BF6 DEST onems1
1590.1 001BF6 F0FF DW onems1-$
1590.2 001BF8 ENDM
1591 001BF8 .... DW EXIT
1592 001BFA
1593 001BFA ;U MS n -- wait about n
milliseconds
1594 001BFA ; 0 DO 1MS LOOP ;
1595 001BFA HEADER MS,2,'MS',DOCOLON
1595.1 000000 PUBLIC MS
1595.2 001BFA .... DW link
1595.3 001BFC FF DB 0FFh ; not immediate
1595.4 001BFD link SET $
1595.5 001BFD 02 DB 2
1595.6 001BFE 4D53 DB 'MS'
1595.7 001C00 EVEN
1595.8 001C00 IF 'DOCOLON'='DOCODE'
1595.9 001C00 MS: DW $+2
1595.10 001C00 ELSE
1595.11 001C00 .... MS: DW DOCOLON
1595.12 001C02 ENDIF
1595.13 001C02 ENDM
1596 001C02 ....0000.... DW lit,0,xdo
1597 001C08 ........ ms1: DW ONEMS,xloop
1598 001C0C DEST ms1
1598.1 001C0C FCFF DW ms1-$
1598.2 001C0E ENDM
1599 001C0E .... DW EXIT
1600 001C10
1601 001C10
1602 001C10
1603 001C10 ;U Bit manipulation words ----------------------
--------------------------------
1604 001C10 ;U based on http://www.forth.org/svfig/Len/bits.
htm
1605 001C10
1606 001C10 ;U CSET mask addr -- set bit from mask
in addr
1607 001C10 HEADER cset,4,'CSET',DOCODE
1607.1 000000 PUBLIC cset
1607.2 001C10 .... DW link
1607.3 001C12 FF DB 0FFh ; not immediate
1607.4 001C13 link SET $
1607.5 001C13 04 DB 4
1607.6 001C14 43534554 DB 'CSET'
1607.7 001C18 EVEN
1607.8 001C18 IF 'DOCODE'='DOCODE'
1607.9 001C18 .... cset: DW $+2
1607.10 001C1A ELSE
1607.11 001C1A cset: DW DOCODE
1607.12 001C1A ENDIF
1607.13 001C1A ENDM
1608 001C1A E7D40000 BIS.B @PSP,0(TOS)
1609 001C1E 2453 ADD #2,PSP
1610 001C20 3744 MOV @PSP+,TOS
1611 001C22 NEXT
1611.1 001C22 3645 MOV @IP+,W // ; fetch word address
into W
1611.2 001C24 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
1611.3 001C26 ENDM
1612 001C26
1613 001C26 ;U CCLR mask addr -- reset bit from mask
in addr
1614 001C26 HEADER cclr,4,'CCLR',DOCODE
1614.1 000000 PUBLIC cclr
1614.2 001C26 .... DW link
1614.3 001C28 FF DB 0FFh ; not immediate
1614.4 001C29 link SET $
1614.5 001C29 04 DB 4
1614.6 001C2A 43434C52 DB 'CCLR'
1614.7 001C2E EVEN
1614.8 001C2E IF 'DOCODE'='DOCODE'
1614.9 001C2E .... cclr: DW $+2
1614.10 001C30 ELSE
1614.11 001C30 cclr: DW DOCODE
1614.12 001C30 ENDIF
1614.13 001C30 ENDM
1615 001C30 E7C40000 BIC.B @PSP,0(TOS)
1616 001C34 2453 ADD #2,PSP
1617 001C36 3744 MOV @PSP+,TOS
1618 001C38 NEXT
1618.1 001C38 3645 MOV @IP+,W // ; fetch word address
into W
1618.2 001C3A 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
1618.3 001C3C ENDM
1619 001C3C
1620 001C3C ;U CTOGGLE mask addr -- flip bit from
mask in addr
1621 001C3C HEADER ctoggle,7,'CTOGGLE',DOCODE
1621.1 000000 PUBLIC ctoggle
1621.2 001C3C .... DW link
1621.3 001C3E FF DB 0FFh ; not immediate
1621.4 001C3F link SET $
1621.5 001C3F 07 DB 7
1621.6 001C40 43544F47474C* DB 'CTOGGLE'
1621.7 001C47 00 EVEN
1621.8 001C48 IF 'DOCODE'='DOCODE'
1621.9 001C48 .... ctoggle: DW $+2
1621.10 001C4A ELSE
1621.11 001C4A ctoggle: DW DOCODE
1621.12 001C4A ENDIF
1621.13 001C4A ENDM
1622 001C4A E7E40000 XOR.B @PSP,0(TOS)
1623 001C4E 2453 ADD #2,PSP
1624 001C50 3744 MOV @PSP+,TOS
1625 001C52 NEXT
1625.1 001C52 3645 MOV @IP+,W // ; fetch word address
into W
1625.2 001C54 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
1625.3 001C56 ENDM
1626 001C56
1627 001C56 ;U CGET mask addr -- flag test bit from
mask in addr
1628 001C56 HEADER cget,4,'CGET',DOCODE
1628.1 000000 PUBLIC cget
1628.2 001C56 .... DW link
1628.3 001C58 FF DB 0FFh ; not immediate
1628.4 001C59 link SET $
1628.5 001C59 04 DB 4
1628.6 001C5A 43474554 DB 'CGET'
1628.7 001C5E EVEN
1628.8 001C5E IF 'DOCODE'='DOCODE'
1628.9 001C5E .... cget: DW $+2
1628.10 001C60 ELSE
1628.11 001C60 cget: DW DOCODE
1628.12 001C60 ENDIF
1628.13 001C60 ENDM
1629 001C60 E7B40000 BIT.B @PSP,0(TOS)
1630 001C64 0224 JZ cget1
1631 001C66 3743 MOV #-1,TOS
1632 001C68 013C JMP cget2
1633 001C6A 0743 cget1:MOV #0, TOS
1634 001C6C 2453 cget2:ADD #2,PSP
1635 001C6E NEXT
1635.1 001C6E 3645 MOV @IP+,W // ; fetch word address
into W
1635.2 001C70 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
1635.3 001C72 ENDM
1636 001C72
1637 001C72 ;U Memory info ---------------------------------
--------------------------------
1638 001C72
1639 001C72 ;Z MEMBOT -- adr begining of flash
1640 001C72 HEADER MEMBOT,6,'MEMBOT',DOCON
1640.1 000000 PUBLIC MEMBOT
1640.2 001C72 .... DW link
1640.3 001C74 FF DB 0FFh ; not immediate
1640.4 001C75 link SET $
1640.5 001C75 06 DB 6
1640.6 001C76 4D454D424F54 DB 'MEMBOT'
1640.7 001C7C EVEN
1640.8 001C7C IF 'DOCON'='DOCODE'
1640.9 001C7C MEMBOT: DW $+2
1640.10 001C7C ELSE
1640.11 001C7C .... MEMBOT: DW DOCON
1640.12 001C7E ENDIF
1640.13 001C7E ENDM
1641 001C7E 00C0 DW FLASHSTART
1642 001C80
1643 001C80 ;Z MEMTOP -- adr end of flash
1644 001C80 HEADER MEMTOP,6,'MEMTOP',DOCON
1644.1 000000 PUBLIC MEMTOP
1644.2 001C80 .... DW link
1644.3 001C82 FF DB 0FFh ; not immediate
1644.4 001C83 link SET $
1644.5 001C83 06 DB 6
1644.6 001C84 4D454D544F50 DB 'MEMTOP'
1644.7 001C8A EVEN
1644.8 001C8A IF 'DOCON'='DOCODE'
1644.9 001C8A MEMTOP: DW $+2
1644.10 001C8A ELSE
1644.11 001C8A .... MEMTOP: DW DOCON
1644.12 001C8C ENDIF
1644.13 001C8C ENDM
1645 001C8C FFDF DW FLASHEND
1646 001C8E
1647 001C8E ;U MEM -- u bytes left in flash
1648 001C8E HEADER MEM,3,'MEM',DOCOLON
1648.1 000000 PUBLIC MEM
1648.2 001C8E .... DW link
1648.3 001C90 FF DB 0FFh ; not immediate
1648.4 001C91 link SET $
1648.5 001C91 03 DB 3
1648.6 001C92 4D454D DB 'MEM'
1648.7 001C95 00 EVEN
1648.8 001C96 IF 'DOCOLON'='DOCODE'
1648.9 001C96 MEM: DW $+2
1648.10 001C96 ELSE
1648.11 001C96 .... MEM: DW DOCOLON
1648.12 001C98 ENDIF
1648.13 001C98 ENDM
1649 001C98 ....FFDF....* DW lit,FLASHEND,IHERE,MINUS
1650 001CA0 .... DW EXIT
1651 001CA2
1652 001CA2 ;U UNUSED -- u bytes left in RAM
1653 001CA2 HEADER UNUSED,6,'UNUSED',DOCOLON
1653.1 000000 PUBLIC UNUSED
1653.2 001CA2 .... DW link
1653.3 001CA4 FF DB 0FFh ; not immediate
1653.4 001CA5 link SET $
1653.5 001CA5 06 DB 6
1653.6 001CA6 554E55534544 DB 'UNUSED'
1653.7 001CAC EVEN
1653.8 001CAC IF 'DOCOLON'='DOCODE'
1653.9 001CAC UNUSED: DW $+2
1653.10 001CAC ELSE
1653.11 001CAC .... UNUSED: DW DOCOLON
1653.12 001CAE ENDIF
1653.13 001CAE ENDM
1654 001CAE ....FF03....* DW lit,RAMEND,HERE,MINUS
1655 001CB6 .... DW EXIT
1656 001CB8
1657 001CB8 ;U MCU Peripherie ------------------------------
--------------------------------
1658 001CB8
1659 001CB8 ;Z P1 -- adr address of port1 output
register
1660 001CB8 HEADER P1,2,'P1',DOCON
1660.1 000000 PUBLIC P1
1660.2 001CB8 .... DW link
1660.3 001CBA FF DB 0FFh ; not immediate
1660.4 001CBB link SET $
1660.5 001CBB 02 DB 2
1660.6 001CBC 5031 DB 'P1'
1660.7 001CBE EVEN
1660.8 001CBE IF 'DOCON'='DOCODE'
1660.9 001CBE P1: DW $+2
1660.10 001CBE ELSE
1660.11 001CBE .... P1: DW DOCON
1660.12 001CC0 ENDIF
1660.13 001CC0 ENDM
1661 001CC0 2100 DW P1OUT
1662 001CC2
1663 001CC2 ;Z P2 -- adr address of port2 output
register
1664 001CC2 HEADER P2,2,'P2',DOCON
1664.1 000000 PUBLIC P2
1664.2 001CC2 .... DW link
1664.3 001CC4 FF DB 0FFh ; not immediate
1664.4 001CC5 link SET $
1664.5 001CC5 02 DB 2
1664.6 001CC6 5032 DB 'P2'
1664.7 001CC8 EVEN
1664.8 001CC8 IF 'DOCON'='DOCODE'
1664.9 001CC8 P2: DW $+2
1664.10 001CC8 ELSE
1664.11 001CC8 .... P2: DW DOCON
1664.12 001CCA ENDIF
1664.13 001CCA ENDM
1665 001CCA 2900 DW P2OUT
1666 001CCC
1667 001CCC ;Z P3 -- adr address of port2 output
register
1668 001CCC HEADER P3,2,'P3',DOCON
1668.1 000000 PUBLIC P3
1668.2 001CCC .... DW link
1668.3 001CCE FF DB 0FFh ; not immediate
1668.4 001CCF link SET $
1668.5 001CCF 02 DB 2
1668.6 001CD0 5033 DB 'P3'
1668.7 001CD2 EVEN
1668.8 001CD2 IF 'DOCON'='DOCODE'
1668.9 001CD2 P3: DW $+2
1668.10 001CD2 ELSE
1668.11 001CD2 .... P3: DW DOCON
1668.12 001CD4 ENDIF
1668.13 001CD4 ENDM
1669 001CD4 1900 DW P3OUT
1670 001CD6
1671 001CD6 ; Note: the first character sent from the MSP430
seems to get
1672 001CD6 ; scrambled. I conjecture this is because the
baud rate generator
1673 001CD6 ; has not reset to the new rate when we attempt
to send a character.
1674 001CD6 ; See init430f1611.s43 for delay after
initialization.
904 001CD6 #include "LaunchPad.s43"
1 001CD6 ; ----------------------------------------------
------------------------
2 001CD6 ; CF430G2553 is a Forth based on CamelForth
3 001CD6 ; for the Texas Instruments MSP430
4 001CD6 ;
5 001CD6 ; This program is free software; you can
redistribute it and/or modify
6 001CD6 ; it under the terms of the GNU General Public
License as published by
7 001CD6 ; the Free Software Foundation; either version 3
of the License, or
8 001CD6 ; (at your option) any later version.
9 001CD6 ;
10 001CD6 ; This program is distributed in the hope that
it will be useful,
11 001CD6 ; but WITHOUT ANY WARRANTY; without even the
implied warranty of
12 001CD6 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the
13 001CD6 ; GNU General Public License for more details.
14 001CD6 ;
15 001CD6 ; You should have received a copy of the GNU
General Public License
16 001CD6 ; along with this program. If not, see
.
17 001CD6 ;
18 001CD6 ; See LICENSE TERMS in Brads file readme.txt as
well.
19 001CD6
20 001CD6 ; ----------------------------------------------
------------------------
21 001CD6 ; LaunchPad.s43 - LaunchPad Suporting Words -
MSP430G2553
22 001CD6 ; ----------------------------------------------
------------------------
23 001CD6
24 001CD6
25 001CD6 ;U PORTS ---------------------------------------
------------------------
26 001CD6
27 001CD6 ; TI document SLAU144I - December 2004 - Revised
January 2012
28 001CD6 ; The digital I/O registers are listed in Table
8-2.
29 001CD6
30 001CD6 ;U \ P1in = $20
31 001CD6 ;U \ P1out = $21
32 001CD6 ;U \ P1dir = $22
33 001CD6
34 001CD6 ;U \ P2in = $28
35 001CD6 ;U \ P2out = $29
36 001CD6 ;U \ P2dir = $2A
37 001CD6
38 001CD6 ;U \ LED - portpinX->---resistor---LED---GND
39 001CD6 ;U \ P1.0 - red LED
40 001CD6 ;U \ P1.6 - green LED
41 001CD6
42 001CD6 ;U RED -- mask port red LED mask
and port address
43 001CD6 HEADER red,3,'RED',DOTWOCON
43.1 000000 PUBLIC red
43.2 001CD6 .... DW link
43.3 001CD8 FF DB 0FFh ; not immediate
43.4 001CD9 link SET $
43.5 001CD9 03 DB 3
43.6 001CDA 524544 DB 'RED'
43.7 001CDD 00 EVEN
43.8 001CDE IF 'DOTWOCON'='DOCODE'
43.9 001CDE red: DW $+2
43.10 001CDE ELSE
43.11 001CDE .... red: DW DOTWOCON
43.12 001CE0 ENDIF
43.13 001CE0 ENDM
44 001CE0 2100 DW P1OUT
45 001CE2 0100 DW 00000001b
46 001CE4
47 001CE4 ;U GREEN -- mask port green LED mask
and port address
48 001CE4 HEADER green,5,'GREEN',DOTWOCON
48.1 000000 PUBLIC green
48.2 001CE4 .... DW link
48.3 001CE6 FF DB 0FFh ; not immediate
48.4 001CE7 link SET $
48.5 001CE7 05 DB 5
48.6 001CE8 475245454E DB 'GREEN'
48.7 001CED 00 EVEN
48.8 001CEE IF 'DOTWOCON'='DOCODE'
48.9 001CEE green: DW $+2
48.10 001CEE ELSE
48.11 001CEE .... green: DW DOTWOCON
48.12 001CF0 ENDIF
48.13 001CF0 ENDM
49 001CF0 2100 DW P1OUT
50 001CF2 4000 DW 01000000b
51 001CF4
52 001CF4 ;U \ Switch S2
53 001CF4 ;U portpin P1.3 --->0_0----GND
54 001CF4 ;U S2 -- mask port second button
mask and port address
55 001CF4 HEADER S2,2,'S2',DOTWOCON
55.1 000000 PUBLIC S2
55.2 001CF4 .... DW link
55.3 001CF6 FF DB 0FFh ; not immediate
55.4 001CF7 link SET $
55.5 001CF7 02 DB 2
55.6 001CF8 5332 DB 'S2'
55.7 001CFA EVEN
55.8 001CFA IF 'DOTWOCON'='DOCODE'
55.9 001CFA S2: DW $+2
55.10 001CFA ELSE
55.11 001CFA .... S2: DW DOTWOCON
55.12 001CFC ENDIF
55.13 001CFC ENDM
56 001CFC 2000 DW P1IN
57 001CFE 0800 DW 00001000b
58 001D00
59 001D00 ;U S2? -- f test button S2, true is
pressed
60 001D00 HEADER SQEST,3,'S2?',DOCOLON
60.1 000000 PUBLIC SQEST
60.2 001D00 .... DW link
60.3 001D02 FF DB 0FFh ; not immediate
60.4 001D03 link SET $
60.5 001D03 03 DB 3
60.6 001D04 53323F DB 'S2?'
60.7 001D07 00 EVEN
60.8 001D08 IF 'DOCOLON'='DOCODE'
60.9 001D08 SQEST: DW $+2
60.10 001D08 ELSE
60.11 001D08 .... SQEST: DW DOCOLON
60.12 001D0A ENDIF
60.13 001D0A ENDM
61 001D0A ............* DW S2, cget, ZEROEQUAL, EXIT
62 001D12
63 001D12 ; ----------------------------------------------
------------------------
905 001D12
906 001D12
907 001D12 /*
908 001D12 ; DEBUG FORTH EXECUTION
909 001D12 ; debug serieal
910 001D12 PUBLIC DEBUGIP
911 001D12 DEBUGIP:
912 001D12 ; DW DOTID
913 001D12 DEBUG1:
914 001D12 ; DW TASK
915 001D12 DW KEY ; 1@A0 test 1=rot,@=grün,A=beide,0=a
us
916 001D12 DW DUP ;,DOTS,CR
917 001D12 DW STORELEDS
918 001D12 ; DW COLD
919 001D12 DW EMIT
920 001D12 DW lit,0,qbran
921 001D12 DW DEBUG1-$
922 001D12 DW bran,-2
923 001D12
924 001D12 /*
925 001D12 ; debugging only
926 001D12 HEADLESS CREATE,DOCOLON
927 001D12 HEADLESS ALLOT,DOCOLON
928 001D12 HEADLESS BUILDS,DOCOLON
929 001D12 HEADLESS ICOMMA,DOCOLON
930 001D12 HEADLESS XDOES,DOCOLON
931 001D12 HEADLESS IHERE,DOCOLON
932 001D12 HEADLESS IALLOT,DOCOLON
933 001D12 HEADLESS CELL,DOCOLON
934 001D12 HEADLESS PJOUT,DOCOLON
935 001D12 */
936 001D12
937 001D12
938 000000 PUBLIC lastword
939 001D12 lastword equ link
940 001D12
941 001D12 ; for debug map only:
942 001D12 CF430FRend:
943 001D12 #define CFlength = CF430FRend-CF430FRstart
944 001D12
945 001D12 END
Segment Type Mode
----------------------------------------
CODE UNTYPED REL
Label Mode Type Segment Value/Offset
------------------------------------------------------------------------------
ABBS REL CONST PUB UNTYP. CODE AB2
ABORT REL CONST PUB UNTYP. CODE 1418
ABORTQUOTE REL CONST PUB UNTYP. CODE 1444
ACC1 REL CONST UNTYP. CODE D30
ACC3 REL CONST UNTYP. CODE D66
ACC4 REL CONST UNTYP. CODE D70
ACC5 REL CONST UNTYP. CODE D74
ACCEPT REL CONST PUB UNTYP. CODE D26
ADC10AE0 ABS CONST UNTYP. ASEG 4A
ADC10CTL0 ABS CONST UNTYP. ASEG 1B0
ADC10CTL1 ABS CONST UNTYP. ASEG 1B2
ADC10DTC0 ABS CONST UNTYP. ASEG 48
ADC10DTC1 ABS CONST UNTYP. ASEG 49
ADC10MEM ABS CONST UNTYP. ASEG 1B4
ADC10SA ABS CONST UNTYP. ASEG 1BC
AGAIN REL CONST PUB UNTYP. CODE 16AA
ALIGNED REL CONST PUB UNTYP. CODE 802
ALIGNN REL CONST PUB UNTYP. CODE 7E8
ALLOT REL CONST PUB UNTYP. CODE 1014
ANDD REL CONST PUB UNTYP. CODE 404
APP REL CONST PUB UNTYP. CODE 9C0
APPCRC REL CONST PUB UNTYP. CODE 1A40
APPU0 REL CONST PUB UNTYP. CODE A7E
AppU0 ABS CONST EXT [012] UNTYP. __EXTERNS Solved Extern
BACKSLASH REL CONST PUB UNTYP. CODE 1B7C
BASE REL CONST PUB UNTYP. CODE 950
BCSCTL1 ABS CONST UNTYP. ASEG 57
BCSCTL2 ABS CONST UNTYP. ASEG 58
BCSCTL3 ABS CONST UNTYP. ASEG 53
BEGIN REL CONST PUB UNTYP. CODE 1684
BELL REL CONST PUB UNTYP. CODE 1BB4
BIN REL CONST PUB UNTYP. CODE 1BC6
BLANK REL CONST PUB UNTYP. CODE A1C
BOOT REL CONST PUB UNTYP. CODE 1A9E
BOOTIP REL CONST PUB UNTYP. CODE 1AA0
BRACCHAR REL CONST PUB UNTYP. CODE 1488
BRACTICK REL CONST PUB UNTYP. CODE 15F2
BUILDS REL CONST PUB UNTYP. CODE 14E0
CACTL1 ABS CONST UNTYP. ASEG 59
CACTL2 ABS CONST UNTYP. ASEG 5A
CALBC1_12MHZ ABS CONST UNTYP. ASEG 10FB
CALBC1_16MHZ ABS CONST UNTYP. ASEG 10F9
CALBC1_1MHZ ABS CONST UNTYP. ASEG 10FF
CALBC1_8MHZ ABS CONST UNTYP. ASEG 10FD
CALDCO_12MHZ ABS CONST UNTYP. ASEG 10FA
CALDCO_16MHZ ABS CONST UNTYP. ASEG 10F8
CALDCO_1MHZ ABS CONST UNTYP. ASEG 10FE
CALDCO_8MHZ ABS CONST UNTYP. ASEG 10FC
CAPD ABS CONST UNTYP. ASEG 5B
CAPITALIZE REL CONST PUB UNTYP. CODE 11E4
CAPS REL CONST PUB UNTYP. CODE 9CC
CAPS1 REL CONST UNTYP. CODE 11FA
CAPS2 REL CONST UNTYP. CODE 1208
CCOMMA REL CONST PUB UNTYP. CODE 1038
CCRC REL CONST PUB UNTYP. CODE 1994
CELL REL CONST PUB UNTYP. CODE 818
CELLPLUS REL CONST PUB UNTYP. CODE 826
CELLS REL CONST PUB UNTYP. CODE 836
CEXIT REL CONST PUB UNTYP. CODE 8DC
CF430FRend REL CONST UNTYP. CODE 1D12
CFETCH REL CONST PUB UNTYP. CODE 22A
CHARPLUS REL CONST PUB UNTYP. CODE 842
CHARR REL CONST PUB UNTYP. CODE 1472
CHARS REL CONST PUB UNTYP. CODE 84E
CMOVE REL CONST PUB UNTYP. CODE 6C4
CMOVEUP REL CONST PUB UNTYP. CODE 6E8
CMOVE_1 REL CONST UNTYP. CODE 6CE
CMOVE_X REL CONST UNTYP. CODE 6D8
CMOVU_1 REL CONST UNTYP. CODE 6F6
CMOVU_X REL CONST UNTYP. CODE 702
COLD REL CONST PUB UNTYP. CODE 1B00
COLON REL CONST PUB UNTYP. CODE 15CE
COMMA REL CONST PUB UNTYP. CODE 1022
COMMABRANCH REL CONST PUB UNTYP. CODE 8F2
COMMACALL REL CONST PUB UNTYP. CODE 898
COMMACF REL CONST PUB UNTYP. CODE 880
COMMADEST REL CONST PUB UNTYP. CODE 900
COMMAJMP REL CONST PUB UNTYP. CODE 8AC
COMMANONE REL CONST PUB UNTYP. CODE 92A
COMMAXT REL CONST PUB UNTYP. CODE 868
CONSTANT REL CONST PUB UNTYP. CODE 84
COR REL CONST PUB UNTYP. CODE A62
CORPOWERON ABS CONST UNTYP. CODE 186
CORREST ABS CONST UNTYP. CODE 18E
COUNT REL CONST PUB UNTYP. CODE C9A
CR REL CONST PUB UNTYP. CODE CAC
CRC REL CONST PUB UNTYP. CODE 19FC
CREATE REL CONST PUB UNTYP. CODE 14F6
CSTORE REL CONST PUB UNTYP. CODE 238
DABS REL CONST PUB UNTYP. CODE AF8
DCOCTL ABS CONST UNTYP. ASEG 56
DDP REL CONST PUB UNTYP. CODE 968
DECIMAL REL CONST PUB UNTYP. CODE FDA
DEPTH REL CONST PUB UNTYP. CODE 17D6
DIGITQ REL CONST PUB UNTYP. CODE 1234
DIV1 REL CONST UNTYP. CODE 672
DIV2 REL CONST UNTYP. CODE 678
DIV3 REL CONST UNTYP. CODE 68C
DIV4 REL CONST UNTYP. CODE 68E
DIVIDE REL CONST UNTYP. CODE 66C
DNEG1 REL CONST UNTYP. CODE AEE
DNEGATE REL CONST PUB UNTYP. CODE AC6
DO REL CONST PUB UNTYP. CODE 170E
DOALIAS REL CONST PUB UNTYP. CODE C4
DOCODE REL CONST UNTYP. CODE Not solved
DOCOLON REL CONST PUB UNTYP. CODE 5A
DOCON REL CONST PUB UNTYP. CODE 8C
DOES REL CONST PUB UNTYP. CODE 152A
DOROM REL CONST PUB UNTYP. CODE 98
DOT REL CONST PUB UNTYP. CODE FB4
DOTCOLD REL CONST PUB UNTYP. CODE 1AEA
DOTQUOTE REL CONST PUB UNTYP. CODE E7C
DOTS REL CONST PUB UNTYP. CODE 194C
DOTS1 REL CONST UNTYP. CODE 197C
DOTS2 REL CONST UNTYP. CODE 198A
DOTSTATUS REL CONST PUB UNTYP. CODE 13BC
DOTVER REL CONST PUB UNTYP. CODE 1B90
DOTWOCON REL CONST PUB UNTYP. CODE 1B66
DOUSER REL CONST PUB UNTYP. CODE B4
DOVAR REL CONST PUB UNTYP. CODE 8C
DROP REL CONST PUB UNTYP. CODE 10A
DTOI REL CONST PUB UNTYP. CODE 364
DTOI_BYTE REL CONST UNTYP. CODE 396
DTOI_END REL CONST UNTYP. CODE 39C
DTOI_LOOP REL CONST UNTYP. CODE 36E
DTOI_WORD REL CONST UNTYP. CODE 384
DTOI_X REL CONST UNTYP. CODE 3AE
DUMP REL CONST PUB UNTYP. CODE 18E0
DUP REL CONST PUB UNTYP. CODE E4
ELSS REL CONST PUB UNTYP. CODE 1668
EMIT REL CONST PUB UNTYP. CODE 796
EMITLOOP REL CONST UNTYP. CODE 798
ENDLOOP REL CONST PUB UNTYP. CODE 172C
ENVIRONMENTQ REL CONST PUB UNTYP. CODE 17F4
EQUAL REL CONST PUB UNTYP. CODE 500
EVALUATE REL CONST PUB UNTYP. CODE 139A
EXECUTE REL CONST PUB UNTYP. CODE 2C
EXIT REL CONST PUB UNTYP. CODE 52
FACTORY REL CONST PUB UNTYP. CODE 1B1E
FACTORYIP REL CONST PUB UNTYP. CODE 1B20
FCTL1 ABS CONST UNTYP. ASEG 128
FCTL2 ABS CONST UNTYP. ASEG 12A
FCTL3 ABS CONST UNTYP. ASEG 12C
FETCH REL CONST PUB UNTYP. CODE 20A
FILL REL CONST PUB UNTYP. CODE 6A0
FILL_1 REL CONST UNTYP. CODE 6AA
FILL_X REL CONST UNTYP. CODE 6B4
FIND REL CONST PUB UNTYP. CODE 1184
FIND1 REL CONST UNTYP. CODE 118A
FIND2 REL CONST UNTYP. CODE 11A2
FIND3 REL CONST UNTYP. CODE 11C0
FLALIGNED REL CONST PUB UNTYP. CODE 1818
FLERASE REL CONST PUB UNTYP. CODE 252
FLE_1 REL CONST UNTYP. CODE 258
FLE_INFO REL CONST UNTYP. CODE 268
FLE_OK REL CONST UNTYP. CODE 274
FLE_X REL CONST UNTYP. CODE 2AA
FL_INFO REL CONST UNTYP. CODE 2A4
FMMOD1 REL CONST UNTYP. CODE B7C
FMSLASHMOD REL CONST PUB UNTYP. CODE B56
GREATER REL CONST PUB UNTYP. CODE 536
HEADR REL CONST PUB UNTYP. CODE 14B2
HERE REL CONST PUB UNTYP. CODE 1002
HEX REL CONST PUB UNTYP. CODE FEE
HIDE REL CONST PUB UNTYP. CODE 157E
HOLD REL CONST PUB UNTYP. CODE EF6
HP REL CONST PUB UNTYP. CODE 990
IALLOT REL CONST PUB UNTYP. CODE 1064
ICCOMMA REL CONST PUB UNTYP. CODE 108A
ICFETCH REL CONST PUB UNTYP. CODE 35A
ICOMMA REL CONST PUB UNTYP. CODE 1072
ICOUNT REL CONST PUB UNTYP. CODE DB2
ICSTORE REL CONST PUB UNTYP. CODE 308
ICST_INFO REL CONST UNTYP. CODE 31C
ICST_OK REL CONST UNTYP. CODE 328
ICST_RAM REL CONST UNTYP. CODE 336
IDP REL CONST PUB UNTYP. CODE 9A6
IE1 ABS CONST UNTYP. ASEG 0
IE2 ABS CONST UNTYP. ASEG 1
IFETCH REL CONST PUB UNTYP. CODE 350
IFF REL CONST PUB UNTYP. CODE 1640
IFG1 ABS CONST UNTYP. ASEG 2
IFG2 ABS CONST UNTYP. ASEG 3
IHERE REL CONST PUB UNTYP. CODE 1052
II REL CONST PUB UNTYP. CODE 5F2
IMMEDIATE REL CONST PUB UNTYP. CODE 15B8
IMMEDQ REL CONST PUB UNTYP. CODE 116C
INFOB REL CONST PUB UNTYP. CODE A70
INTER1 REL CONST UNTYP. CODE 133C
INTER2 REL CONST UNTYP. CODE 1366
INTER3 REL CONST UNTYP. CODE 1368
INTER4 REL CONST UNTYP. CODE 136C
INTER5 REL CONST UNTYP. CODE 1378
INTER6 REL CONST UNTYP. CODE 1386
INTER8 REL CONST UNTYP. CODE 1386
INTER9 REL CONST UNTYP. CODE 138A
INTERPRET REL CONST PUB UNTYP. CODE 132E
INVERT REL CONST PUB UNTYP. CODE 434
ISQUOTE REL CONST PUB UNTYP. CODE E38
ISTORE REL CONST PUB UNTYP. CODE 2B6
IST_INFO REL CONST UNTYP. CODE 2CE
IST_OK REL CONST UNTYP. CODE 2DA
IST_RAM REL CONST UNTYP. CODE 2E8
IST_X REL CONST UNTYP. CODE 2FA
ITHERE REL CONST PUB UNTYP. CODE 1A14
ITOD REL CONST PUB UNTYP. CODE 710
ITYP3 REL CONST UNTYP. CODE DD8
ITYP4 REL CONST UNTYP. CODE DE6
ITYP5 REL CONST UNTYP. CODE DE8
ITYPE REL CONST PUB UNTYP. CODE DC8
IWORD REL CONST PUB UNTYP. CODE E92
IWORD1 REL CONST UNTYP. CODE E96
IWORDC REL CONST PUB UNTYP. CODE EA4
JJ REL CONST PUB UNTYP. CODE 608
KEY REL CONST PUB UNTYP. CODE 7B0
KEYLOOP REL CONST UNTYP. CODE 7B2
KEYQ REL CONST PUB UNTYP. CODE 7CE
L$002 REL CONST UNTYP. CODE 642
L$01 REL CONST UNTYP. CODE 64A
L0 REL CONST PUB UNTYP. CODE 9E2
LATEST REL CONST PUB UNTYP. CODE 986
LDUMP1 REL CONST UNTYP. CODE 18EA
LDUMP2 REL CONST UNTYP. CODE 1904
LDUMP3 REL CONST UNTYP. CODE 1922
LEAV REL CONST PUB UNTYP. CODE 1772
LEFTBRACKET REL CONST PUB UNTYP. CODE 1558
LESS REL CONST PUB UNTYP. CODE 522
LESSNUM REL CONST PUB UNTYP. CODE F0E
LFROM REL CONST PUB UNTYP. CODE 16F6
LITER1 REL CONST UNTYP. CODE 1228
LITERAL REL CONST PUB UNTYP. CODE 1216
LOO REL CONST PUB UNTYP. CODE 174A
LOOP1 REL CONST UNTYP. CODE 1732
LOOP2 REL CONST UNTYP. CODE 1740
LP REL CONST PUB UNTYP. CODE 99A
LSHIFT REL CONST PUB UNTYP. CODE 4A0
LSH_1 REL CONST UNTYP. CODE 4AA
LSH_X REL CONST UNTYP. CODE 4B0
LSTACK ABS CONST EXT [003] UNTYP. __EXTERNS Solved Extern
MACU REL CONST UNTYP. CODE 63E
MARKER REL CONST PUB UNTYP. CODE 1836
MAX REL CONST PUB UNTYP. CODE BEE
MAX1 REL CONST UNTYP. CODE BFA
MEM REL CONST PUB UNTYP. CODE 1C96
MEMBOT REL CONST PUB UNTYP. CODE 1C7C
MEMTOP REL CONST PUB UNTYP. CODE 1C8A
MIN REL CONST PUB UNTYP. CODE C06
MIN1 REL CONST UNTYP. CODE C12
MINUS REL CONST PUB UNTYP. CODE 3F0
MODD REL CONST PUB UNTYP. CODE BBA
MOVE REL CONST PUB UNTYP. CODE 17AA
MOVE1 REL CONST UNTYP. CODE 17C6
MOVE2 REL CONST UNTYP. CODE 17CA
MPLUS REL CONST PUB UNTYP. CODE 3DA
MPYU REL CONST UNTYP. CODE 63A
MS REL CONST PUB UNTYP. CODE 1C00
MSTAR REL CONST PUB UNTYP. CODE B06
NEGATE REL CONST PUB UNTYP. CODE 446
NEQUAL REL CONST PUB UNTYP. CODE 78C
NEWEST REL CONST PUB UNTYP. CODE 9B4
NFATOCFA REL CONST PUB UNTYP. CODE 1152
NFATOLFA REL CONST PUB UNTYP. CODE 113C
NINIT REL CONST PUB UNTYP. CODE A56
NIP REL CONST PUB UNTYP. CODE 164
NODUP REL CONST UNTYP. CODE FE
NOOP REL CONST PUB UNTYP. CODE 1806
NOTEQUAL REL CONST PUB UNTYP. CODE 514
NUM REL CONST PUB UNTYP. CODE F42
NUMGREATER REL CONST PUB UNTYP. CODE F6E
NUMS REL CONST PUB UNTYP. CODE F58
NUMS1 REL CONST UNTYP. CODE F5A
ONEMINUS REL CONST PUB UNTYP. CODE 464
ONEMS REL CONST PUB UNTYP. CODE 1BDA
ONEPLUS REL CONST PUB UNTYP. CODE 456
ORR REL CONST PUB UNTYP. CODE 412
OVER REL CONST PUB UNTYP. CODE 130
P1 REL CONST PUB UNTYP. CODE 1CBE
P1DIR ABS CONST UNTYP. ASEG 22
P1IE ABS CONST UNTYP. ASEG 25
P1IES ABS CONST UNTYP. ASEG 24
P1IFG ABS CONST UNTYP. ASEG 23
P1IN ABS CONST UNTYP. ASEG 20
P1OUT ABS CONST UNTYP. ASEG 21
P1REN ABS CONST UNTYP. ASEG 27
P1SEL ABS CONST UNTYP. ASEG 26
P1SEL2 ABS CONST UNTYP. ASEG 41
P2 REL CONST PUB UNTYP. CODE 1CC8
P2DIR ABS CONST UNTYP. ASEG 2A
P2IE ABS CONST UNTYP. ASEG 2D
P2IES ABS CONST UNTYP. ASEG 2C
P2IFG ABS CONST UNTYP. ASEG 2B
P2IN ABS CONST UNTYP. ASEG 28
P2OUT ABS CONST UNTYP. ASEG 29
P2REN ABS CONST UNTYP. ASEG 2F
P2SEL ABS CONST UNTYP. ASEG 2E
P2SEL2 ABS CONST UNTYP. ASEG 42
P3 REL CONST PUB UNTYP. CODE 1CD2
P3DIR ABS CONST UNTYP. ASEG 1A
P3IN ABS CONST UNTYP. ASEG 18
P3OUT ABS CONST UNTYP. ASEG 19
P3REN ABS CONST UNTYP. ASEG 10
P3SEL ABS CONST UNTYP. ASEG 1B
P3SEL2 ABS CONST UNTYP. ASEG 43
PAD REL CONST PUB UNTYP. CODE 9D8
PADAREA ABS CONST EXT [002] UNTYP. __EXTERNS Solved Extern
PAREN REL CONST PUB UNTYP. CODE 149C
PCRC REL CONST PUB UNTYP. CODE 19D2
PLUS REL CONST PUB UNTYP. CODE 3BA
PLUSLOOP REL CONST PUB UNTYP. CODE 175E
PLUSSTORE REL CONST PUB UNTYP. CODE 3C8
POST1 REL CONST UNTYP. CODE 1636
POST2 REL CONST UNTYP. CODE 1638
POSTPONE REL CONST PUB UNTYP. CODE 160C
PROMPT REL CONST PUB UNTYP. CODE 13C8
PROMPT1 REL CONST UNTYP. CODE 13DC
PSTACK ABS CONST EXT [004] UNTYP. __EXTERNS Solved Extern
PUSHTOS REL CONST UNTYP. CODE E6
QABO1 REL CONST UNTYP. CODE 1436
QABORT REL CONST PUB UNTYP. CODE 142A
QDNEGATE REL CONST PUB UNTYP. CODE AE4
QDUP REL CONST PUB UNTYP. CODE F8
QNEG1 REL CONST UNTYP. CODE AA8
QNEGATE REL CONST PUB UNTYP. CODE A9E
QNUM1 REL CONST UNTYP. CODE 130E
QNUM2 REL CONST UNTYP. CODE 131A
QNUM3 REL CONST UNTYP. CODE 131E
QNUMBER REL CONST PUB UNTYP. CODE 12E8
QSIGN REL CONST PUB UNTYP. CODE 1270
QSIGN1 REL CONST UNTYP. CODE 129A
QUIT REL CONST PUB UNTYP. CODE 13E6
QUIT1 REL CONST UNTYP. CODE 13FA
QUITIP REL CONST PUB UNTYP. CODE 13E8
RAMDICT ABS CONST EXT [007] UNTYP. __EXTERNS Solved Extern
RECURSE REL CONST PUB UNTYP. CODE 1546
REPEAT REL CONST PUB UNTYP. CODE 16D2
REVEAL REL CONST PUB UNTYP. CODE 159E
RFETCH REL CONST PUB UNTYP. CODE 196
RFROM REL CONST PUB UNTYP. CODE 182
RIGHTBRACKET REL CONST PUB UNTYP. CODE 156A
ROMDICT ABS CONST EXT [-001] UNTYP. __EXTERNS Solved Extern
ROT REL CONST PUB UNTYP. CODE 148
RPFETCH REL CONST PUB UNTYP. CODE 1D4
RPSTORE REL CONST PUB UNTYP. CODE 1EA
RSHIFT REL CONST PUB UNTYP. CODE 4C0
RSH_1 REL CONST UNTYP. CODE 4CA
RSH_X REL CONST UNTYP. CODE 4D2
RSTACK ABS CONST EXT [005] UNTYP. __EXTERNS Solved Extern
RZERO REL CONST PUB UNTYP. CODE 9EC
S0 REL CONST PUB UNTYP. CODE 9F6
S2 REL CONST PUB UNTYP. CODE 1CFA
SAVE REL CONST PUB UNTYP. CODE 1A7A
SCAN REL CONST PUB UNTYP. CODE 740
SCAN_1 REL CONST UNTYP. CODE 74A
SCAN_X REL CONST UNTYP. CODE 754
SEMICOLON REL CONST PUB UNTYP. CODE 15E0
SEQUAL REL CONST PUB UNTYP. CODE 764
SEQU_1 REL CONST UNTYP. CODE 76E
SEQU_X REL CONST UNTYP. CODE 782
SIGN REL CONST PUB UNTYP. CODE F86
SIGN1 REL CONST UNTYP. CODE F94
SKIP REL CONST PUB UNTYP. CODE 71A
SKIP_1 REL CONST UNTYP. CODE 724
SKIP_X REL CONST UNTYP. CODE 72E
SLASH REL CONST PUB UNTYP. CODE BAA
SLASHMOD REL CONST PUB UNTYP. CODE B98
SLASHSTRING REL CONST PUB UNTYP. CODE 10B8
SMISMATCH REL CONST UNTYP. CODE 77C
SMSLASHREM REL CONST PUB UNTYP. CODE B28
SOURCE REL CONST PUB UNTYP. CODE 10A4
SPACE REL CONST PUB UNTYP. CODE CC6
SPACES REL CONST PUB UNTYP. CODE CD8
SPCS1 REL CONST UNTYP. CODE CDA
SPCS2 REL CONST UNTYP. CODE CE8
SPFETCH REL CONST PUB UNTYP. CODE 1AC
SPSTORE REL CONST PUB UNTYP. CODE 1C2
SQEST REL CONST PUB UNTYP. CODE 1D08
SQUOTE REL CONST PUB UNTYP. CODE E56
SSMOD REL CONST PUB UNTYP. CODE BCC
STAR REL CONST PUB UNTYP. CODE B88
STARSLASH REL CONST PUB UNTYP. CODE BDE
STATE REL CONST PUB UNTYP. CODE 95E
STOD REL CONST PUB UNTYP. CODE A8A
STORCOLON REL CONST PUB UNTYP. CODE 8C2
STORE REL CONST PUB UNTYP. CODE 218
STORECF REL CONST PUB UNTYP. CODE 874
STOREDEST REL CONST PUB UNTYP. CODE 914
SWAP REL CONST PUB UNTYP. CODE 11A
SWAPBYTES REL CONST PUB UNTYP. CODE 472
TA0CCR0 ABS CONST UNTYP. ASEG 172
TA0CCR1 ABS CONST UNTYP. ASEG 174
TA0CCR2 ABS CONST UNTYP. ASEG 176
TA0CCTL0 ABS CONST UNTYP. ASEG 162
TA0CCTL1 ABS CONST UNTYP. ASEG 164
TA0CCTL2 ABS CONST UNTYP. ASEG 166
TA0CTL ABS CONST UNTYP. ASEG 160
TA0IV ABS CONST UNTYP. ASEG 12E
TA0R ABS CONST UNTYP. ASEG 170
TA1CCR0 ABS CONST UNTYP. ASEG 192
TA1CCR1 ABS CONST UNTYP. ASEG 194
TA1CCR2 ABS CONST UNTYP. ASEG 196
TA1CCTL0 ABS CONST UNTYP. ASEG 182
TA1CCTL1 ABS CONST UNTYP. ASEG 184
TA1CCTL2 ABS CONST UNTYP. ASEG 186
TA1CTL ABS CONST UNTYP. ASEG 180
TA1IV ABS CONST UNTYP. ASEG 11E
TA1R ABS CONST UNTYP. ASEG 190
THEN REL CONST PUB UNTYP. CODE 1656
TIB REL CONST PUB UNTYP. CODE A02
TIBAREA ABS CONST EXT [006] UNTYP. __EXTERNS Solved Extern
TIBSIZE REL CONST PUB UNTYP. CODE A12
TIB_SIZE ABS CONST EXT [008] UNTYP. __EXTERNS Solved Extern
TICK REL CONST PUB UNTYP. CODE 1456
TICKSOURCE REL CONST PUB UNTYP. CODE 978
TOBODY REL CONST PUB UNTYP. CODE 85A
TOCOUNTED REL CONST PUB UNTYP. CODE 10D4
TODIGIT REL CONST PUB UNTYP. CODE F22
TOIN REL CONST PUB UNTYP. CODE 944
TOL REL CONST PUB UNTYP. CODE 16E0
TONUM1 REL CONST UNTYP. CODE 12AA
TONUM2 REL CONST UNTYP. CODE 12C0
TONUM3 REL CONST UNTYP. CODE 12DA
TONUMBER REL CONST PUB UNTYP. CODE 12A8
TOR REL CONST PUB UNTYP. CODE 172
TOSFALSE REL CONST UNTYP. CODE 508
TOSTRUE REL CONST UNTYP. CODE 52A
TUCK REL CONST PUB UNTYP. CODE 1FC
TWOCONSTANT REL CONST PUB UNTYP. CODE 1B5C
TWODROP REL CONST PUB UNTYP. CODE C48
TWODUP REL CONST PUB UNTYP. CODE C58
TWOFETCH REL CONST PUB UNTYP. CODE C1C
TWOOVER REL CONST PUB UNTYP. CODE C80
TWOSLASH REL CONST PUB UNTYP. CODE 48E
TWOSTAR REL CONST PUB UNTYP. CODE 480
TWOSTORE REL CONST PUB UNTYP. CODE C30
TWOSWAP REL CONST PUB UNTYP. CODE C6A
TYP REL CONST PUB UNTYP. CODE D86
TYP3 REL CONST UNTYP. CODE D96
TYP4 REL CONST UNTYP. CODE DA4
TYP5 REL CONST UNTYP. CODE DA6
U0 REL CONST PUB UNTYP. CODE 938
UAREA ABS CONST EXT [001] UNTYP. __EXTERNS Solved Extern
UAREA_SIZE ABS CONST EXT [009] UNTYP. __EXTERNS Solved Extern
UCA0ABCTL ABS CONST UNTYP. ASEG 5D
UCA0BR0 ABS CONST UNTYP. ASEG 62
UCA0BR1 ABS CONST UNTYP. ASEG 63
UCA0CTL0 ABS CONST UNTYP. ASEG 60
UCA0CTL1 ABS CONST UNTYP. ASEG 61
UCA0IRRCTL ABS CONST UNTYP. ASEG 5F
UCA0IRTCTL ABS CONST UNTYP. ASEG 5E
UCA0MCTL ABS CONST UNTYP. ASEG 64
UCA0RXBUF ABS CONST UNTYP. ASEG 66
UCA0STAT ABS CONST UNTYP. ASEG 65
UCA0TXBUF ABS CONST UNTYP. ASEG 67
UCB0BR0 ABS CONST UNTYP. ASEG 6A
UCB0BR1 ABS CONST UNTYP. ASEG 6B
UCB0CTL0 ABS CONST UNTYP. ASEG 68
UCB0CTL1 ABS CONST UNTYP. ASEG 69
UCB0I2CIE ABS CONST UNTYP. ASEG 6C
UCB0I2COA ABS CONST UNTYP. ASEG 118
UCB0I2CSA ABS CONST UNTYP. ASEG 11A
UCB0RXBUF ABS CONST UNTYP. ASEG 6E
UCB0STAT ABS CONST UNTYP. ASEG 6D
UCB0TXBUF ABS CONST UNTYP. ASEG 6F
UDOT REL CONST PUB UNTYP. CODE F9C
UDOTR REL CONST PUB UNTYP. CODE 18B8
UDSLASHMOD REL CONST PUB UNTYP. CODE EB8
UDSTAR REL CONST PUB UNTYP. CODE ED8
UGREATER REL CONST PUB UNTYP. CODE 554
UINIT REL CONST PUB UNTYP. CODE A2A
ULESS REL CONST PUB UNTYP. CODE 544
UMAX REL CONST PUB UNTYP. CODE D0C
UMAX1 REL CONST UNTYP. CODE D18
UMIN REL CONST PUB UNTYP. CODE CF4
UMIN1 REL CONST UNTYP. CODE D00
UMSLASHMOD REL CONST PUB UNTYP. CODE 666
UMSTAR REL CONST PUB UNTYP. CODE 636
UNLOOP REL CONST PUB UNTYP. CODE 624
UNTIL REL CONST PUB UNTYP. CODE 1694
UNUSED REL CONST PUB UNTYP. CODE 1CAC
UP ABS CONST EXT [000] UNTYP. __EXTERNS Solved Extern
UPC REL CONST PUB UNTYP. CODE 11C2
UPC1 REL CONST UNTYP. CODE 11DC
USER REL CONST PUB UNTYP. CODE AC
VALIDQ REL CONST PUB UNTYP. CODE 1A64
VARIABLE REL CONST PUB UNTYP. CODE 6E
WARM REL CONST PUB UNTYP. CODE 1ADC
WDS1 REL CONST UNTYP. CODE 1892
WDTCTL ABS CONST UNTYP. ASEG 120
WHILE REL CONST PUB UNTYP. CODE 16C0
WIPE REL CONST PUB UNTYP. CODE 1B34
WITHIN REL CONST PUB UNTYP. CODE 1792
WORD1 REL CONST UNTYP. CODE 110E
WORDD REL CONST PUB UNTYP. CODE 10EA
WORDS REL CONST PUB UNTYP. CODE 188C
XDOES REL CONST PUB UNTYP. CODE 1512
XISQUOTE REL CONST PUB UNTYP. CODE DF4
XORR REL CONST PUB UNTYP. CODE 422
XSQUOTE REL CONST PUB UNTYP. CODE E0C
ZEROEQUAL REL CONST PUB UNTYP. CODE 4DE
ZEROLESS REL CONST PUB UNTYP. CODE 4EE
__MSP430G2203__ ABS CONST UNTYP. ASEG Not solved
boot1 REL CONST UNTYP. CODE 1AD2
bran REL CONST PUB UNTYP. CODE 566
cclr REL CONST PUB UNTYP. CODE 1C2E
ccrc1 REL CONST UNTYP. CODE 19A8
cget REL CONST PUB UNTYP. CODE 1C5E
cget1 REL CONST UNTYP. CODE 1C6A
cget2 REL CONST UNTYP. CODE 1C6C
cor ABS CONST EXT [010] UNTYP. __EXTERNS Solved Extern
crcval ABS CONST EXT [013] UNTYP. __EXTERNS Solved Extern
cset REL CONST PUB UNTYP. CODE 1C18
ctoggle REL CONST PUB UNTYP. CODE 1C48
dobran REL CONST UNTYP. CODE 568
docreate REL CONST PUB UNTYP. CODE 8C
dodoes REL CONST PUB UNTYP. CODE C8
donext REL CONST UNTYP. CODE 7C2
donoop REL CONST UNTYP. CODE 7C2
dotcold0 REL CONST UNTYP. CODE 1AEF
dotcold1 REL CONST UNTYP. CODE 1AF4
green REL CONST PUB UNTYP. CODE 1CEE
ih1 REL CONST UNTYP. CODE 1A18
infoB ABS CONST EXT [011] UNTYP. __EXTERNS Solved Extern
invalid REL CONST UNTYP. CODE 1AB2
lastword REL CONST PUB UNTYP. CODE 1D03
link REL VAR UNTYP. CODE 1D03
lit REL CONST PUB UNTYP. CODE 3C
ms1 REL CONST UNTYP. CODE 1C08
nullirq ABS CONST EXT [-001] UNTYP. __EXTERNS Solved Extern
onems1 REL CONST UNTYP. CODE 1BE6
onems2 REL CONST UNTYP. CODE 1BF0
pcrc1 REL CONST UNTYP. CODE 19E2
pcrc2 REL CONST UNTYP. CODE 19F0
pcrc3 REL CONST UNTYP. CODE 19F2
qbran REL CONST PUB UNTYP. CODE 57A
red REL CONST PUB UNTYP. CODE 1CDE
reset REL CONST UNTYP. CODE 1AC0
valid REL CONST UNTYP. CODE 1AB0
ver0 REL CONST UNTYP. CODE 1
verend REL CONST UNTYP. CODE 20
version REL CONST UNTYP. CODE 0
warm0 REL CONST UNTYP. CODE 1AE1
warm1 REL CONST UNTYP. CODE 1AE6
wipmsg0 REL CONST UNTYP. CODE 1B39
wipmsg1 REL CONST UNTYP. CODE 1B40
xdo REL CONST PUB UNTYP. CODE 590
xloop REL CONST PUB UNTYP. CODE 5B6
xplusloop REL CONST PUB UNTYP. CODE 5D6
##############################
# CRC:C78 #
# Errors: 0 #
# Warnings: 0 #
# Bytes: 7442 #
##############################