###############################################################################
# #
# IAR Assembler V5.30.1.50284/W32 for MSP430 05/Apr/2012 00:45:03 #
# Copyright 1996-2011 IAR Systems AB. #
# #
# Target option = MSP430 #
# Source file = C:\Dokumente und Einstellungen\All Users\Dokumente\4e4th-se\se-core430G2553.s43#
# List file = C:\Dokumente und Einstellungen\All Users\Dokumente\4e4th-se\Debug\List\se-core430G2553.lst#
# Object file = C:\Dokumente und Einstellungen\All Users\Dokumente\4e4th-se\Debug\Obj\se-core430G2553.r43#
# Command line = C:\Dokumente und Einstellungen\All Users\Dokumente\4e4th-se\se-core430G2553.s43 #
# -OC:\Dokumente und Einstellungen\All Users\Dokumente\4e4th-se\Debug\Obj\ #
# -s+ -M<> -w+ #
# -LC:\Dokumente und Einstellungen\All Users\Dokumente\4e4th-se\Debug\List\ #
# -i -t8 -x -r -D__MSP430G2553__ #
# -IC:\Programme\IAR Systems\Embedded Workbench 6.0 Kickstart\430\INC\ #
# #
###############################################################################
1 000000 ; ----------------------------------------------
------------------------
2 000000 ; CamelForth for the Texas Instruments MSP430
3 000000 ; (c) 2009 Bradford J. Rodriguez.
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 ; Commercial inquiries should be directed to the
author at
19 000000 ; 115 First St., #105, Collingwood, Ontario L9Y
4W3 Canada
20 000000 ; or via email to bj@camelforth.com
21 000000
22 000000 ; ----------------------------------------------
------------------------
23 000000 ; core430.s43 - Machine Language Primitives -
MSP430G2553
24 000000 ; mk version
25 000000 ; ----------------------------------------------
------------------------
26 000000 ; Revision History
27 000000 ; 1 mar 09 bjr - changed Flash write and erase
primitives to correctly
28 000000 ; write RAM outside Info Flash and Main
Flash address limits.
29 000000
30 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
31 000000 #include "se-CF430G2553forth.h" ; header
macros and register defs
1 000000 /*
2 000000 ; Vorlage war:
3 000000 ; forth.h: Register, Model, and Macro declaratio
ns - MSP430F1611
4 000000 ; B. Rodriguez 3 Jan 09
5 000000 ; ----------------------------------------------
------------------------
6 000000 */
7 000000
8 000000 // ; FORTH MEMORY USAGE
9 000000 // ; for Flash memory operations - this includes
information and main
10 000000 // ; ROM, but not the main ROM used by the
kernel (above E000h)
11 000000 #define INFOSTART (0x1000) // ok mk
12 000000 #define INFOEND (0x10FF) // ok mk
13 000000 #define RAMSTART (0x0200) // ok mk
14 000000 #define RAMEND (0x03FF) // ok mk
15 000000 #define FLASHSTART (0xC000) // ok mk
16 000000 #define FLASHEND (0xDFFF) // ok mk
17 000000 #define MAINSEG (512) // wozu ?? mk
18 000000 #define INFOSEG (128) // ?? mk
19 000000
20 000000 // ; FORTH REGISTER USAGE
21 000000
22 000000 // ; Forth virtual machine
23 000000 #define RSP SP
24 000000 #define PSP R4
25 000000 #define IP R5
26 000000 #define W R6
27 000000 #define TOS R7
28 000000
29 000000 // ; Loop parameters in registers
30 000000 #define INDEX R8
31 000000 #define LIMIT R9
32 000000
33 000000 // ; Scratch registers
34 000000 #define X R10
35 000000 #define Y R11
36 000000 #define Q R12
37 000000 #define T R13
38 000000
39 000000 // ; T.I. Integer Subroutines Definitions
40 000000 #define IROP1 TOS
41 000000 #define IROP2L R10
42 000000 #define IROP2M R11
43 000000 #define IRACL R12
44 000000 #define IRACM R13
45 000000 #define IRBT W
46 000000
47 000000 #define fcpu (8000) ; Takt in KHz, siehe
se-init430G2553.s43
48 000000
49 000000
50 000000 // ; INDIRECT-THREADED NEXT
51 000000
56 000000
57 000000 // ; BRANCH DESTINATION (RELATIVE BRANCH)
58 000000 // ; For relative branch addresses, i.e., a
branch is ADD @IP,IP
59 000000
63 000000
64 000000 // ; HEADER CONSTRUCTION MACROS
65 000000
80 000000
89 000000
104 000000
32 000000
33 000000 EXTERN UP,UAREA,PADAREA,LSTACK,PSTACK,R
STACK
34 000000 EXTERN TIBAREA,RAMDICT,ROMDICT
35 000000 EXTERN TIB_SIZE,UAREA_SIZE,nullirq
36 000000
37 000000 RSEG CODE ; place
program in 'CODE' segment
38 000000
39 000000 link SET 0 ; initial dictionary
link
40 000000
41 000000 version:
42 000000 1D DB (verend-ver0)
43 000001 34453474682D*ver0: DB '4E4th-se v0.34 ',__date__,'|'
44 00001D 00 EVEN
45 00001E verend:
46 00001E
47 00001E ; ----------------------------------------------
------------------------
48 00001E ; INTERPRETER LOGIC
49 00001E ; ITC NEXT is defined as
50 00001E ; MOV @IP+,W ; 2 fetch word address
into W
51 00001E ; MOV @W+,PC ; 2 fetch code address
into PC, W=PFA
52 00001E
53 00001E ;C EXECUTE i*x xt -- j*x execute Forth
word
54 00001E ;C at 'xt'
55 00001E HEADER EXECUTE,7,'execute',DOCODE
55.1 000000 PUBLIC EXECUTE
55.2 00001E 0000 DW link
55.3 000020 FF DB 0FFh ; not immediate
55.4 000021 link SET $
55.5 000021 07 DB 7
55.6 000022 657865637574* DB 'execute'
55.7 000029 00 EVEN
55.8 00002A IF 'DOCODE'='DOCODE'
55.9 00002A .... EXECUTE: DW $+2
55.10 00002C ELSE
55.11 00002C EXECUTE: DW DOCODE
55.12 00002C ENDIF
55.13 00002C ENDM
56 00002C 0647 MOV TOS,W ; 1 put word address
into W
57 00002E 3744 MOV @PSP+,TOS ; 2 fetch new TOS
58 000030 3046 MOV @W+,PC ; 2 fetch code address
into PC, W=PFA
59 000032
60 000032 ;Z lit -- x fetch inline literal to
stack
61 000032 ; This is the primtive compiled by LITERAL.
62 000032 HEADER lit,3,'lit',DOCODE
62.1 000000 PUBLIC lit
62.2 000032 .... DW link
62.3 000034 FF DB 0FFh ; not immediate
62.4 000035 link SET $
62.5 000035 03 DB 3
62.6 000036 6C6974 DB 'lit'
62.7 000039 00 EVEN
62.8 00003A IF 'DOCODE'='DOCODE'
62.9 00003A .... lit: DW $+2
62.10 00003C ELSE
62.11 00003C lit: DW DOCODE
62.12 00003C ENDIF
62.13 00003C ENDM
63 00003C 2483 SUB #2,PSP ; 1 push old TOS..
64 00003E 84470000 MOV TOS,0(PSP) ; 4 ..onto stack
65 000042 3745 MOV @IP+,TOS ; 2 fetch new TOS
value
66 000044 NEXT ; 4
66.1 000044 3645 MOV @IP+,W // ; fetch word address
into W
66.2 000046 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
66.3 000048 ENDM
67 000048
68 000048 ;C EXIT -- exit a colon
definition
69 000048 HEADER EXIT,4,'exit',DOCODE
69.1 000000 PUBLIC EXIT
69.2 000048 .... DW link
69.3 00004A FF DB 0FFh ; not immediate
69.4 00004B link SET $
69.5 00004B 04 DB 4
69.6 00004C 65786974 DB 'exit'
69.7 000050 EVEN
69.8 000050 IF 'DOCODE'='DOCODE'
69.9 000050 .... EXIT: DW $+2
69.10 000052 ELSE
69.11 000052 EXIT: DW DOCODE
69.12 000052 ENDIF
69.13 000052 ENDM
70 000052 3541 MOV @RSP+,IP ; 2 pop old IP from
return stack
71 000054 NEXT ; 4
71.1 000054 3645 MOV @IP+,W // ; fetch word address
into W
71.2 000056 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
71.3 000058 ENDM
72 000058
73 000058 ; ----------------------------------------------
------------------------
74 000058 ; DEFINING WORDS - ROMable ITC model
75 000058
76 000058 ; DOCOLON enters a new high-level thread (colon
definition.)
77 000058 ; (internal code fragment, not a Forth
word)
78 000000 PUBLIC DOCOLON
79 000058 DOCOLON:
80 000058 0512 PUSH IP ; 3 save old IP on
return stack
81 00005A 0546 MOV W,IP ; 1 set new IP to
PFA
82 00005C NEXT ; 4
82.1 00005C 3645 MOV @IP+,W // ; fetch word address
into W
82.2 00005E 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
82.3 000060 ENDM
83 000060
84 000060 ;C VARIABLE -- define a Forth
VARIABLE
85 000060 ; CREATE CELL ALLOT ;
86 000060 ; Action of ROMable variable is the same as
CREATE; it builds a
87 000060 ; constant holding the RAM address. See CREATE
in hilvl430.s43.
88 000060 HEADER VARIABLE,8,'variable',DOCOLON
88.1 000000 PUBLIC VARIABLE
88.2 000060 .... DW link
88.3 000062 FF DB 0FFh ; not immediate
88.4 000063 link SET $
88.5 000063 08 DB 8
88.6 000064 766172696162* DB 'variable'
88.7 00006C EVEN
88.8 00006C IF 'DOCOLON'='DOCODE'
88.9 00006C VARIABLE: DW $+2
88.10 00006C ELSE
88.11 00006C .... VARIABLE: DW DOCOLON
88.12 00006E ENDIF
88.13 00006E ENDM
89 00006E ............* DW CREATE,CELL,ALLOT,EXIT
90 000076
91 000076 ;C CONSTANT -- define a Forth
constant
92 000076 ; (machine code fragment)
94 000076 ; Note that the constant is stored in Code
space.
95 000076 HEADER CONSTANT,8,'constant',DOCOLON
95.1 000000 PUBLIC CONSTANT
95.2 000076 .... DW link
95.3 000078 FF DB 0FFh ; not immediate
95.4 000079 link SET $
95.5 000079 08 DB 8
95.6 00007A 636F6E737461* DB 'constant'
95.7 000082 EVEN
95.8 000082 IF 'DOCOLON'='DOCODE'
95.9 000082 CONSTANT: DW $+2
95.10 000082 ELSE
95.11 000082 .... CONSTANT: DW DOCOLON
95.12 000084 ENDIF
95.13 000084 ENDM
96 000084 ............ DW BUILDS,ICOMMA,XDOES
97 00008A ; DOCON, code action of CONSTANT,
98 00008A ; entered with W=Parameter Field Adrs
99 00008A ; This is also the action of VARIABLE (Harvard
model)
100 00008A ; This is also the action of CREATE (Harvard
model)
101 000000 PUBLIC DOCON
102 000000 PUBLIC docreate
103 000000 PUBLIC DOVAR
104 00008A docreate: ; -- a-addr ; ROMable CREATE fetches
address from PFA
105 00008A DOVAR: ; -- a-addr ; ROMable VARIABLE
fetches address from PFA
106 00008A DOCON: ; -- x ; CONSTANT fetches cell
from PFA to TOS
107 00008A 2483 SUB #2,PSP ; make room on
stack
108 00008C 84470000 MOV TOS,0(PSP)
109 000090 2746 MOV @W,TOS ; fetch from parameter
field to TOS
110 000092 NEXT
110.1 000092 3645 MOV @IP+,W // ; fetch word address
into W
110.2 000094 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
110.3 000096 ENDM
111 000096
112 000096 ; DOCREATE's action is for a table in RAM.
113 000096 ; DOROM is the code action for a table in
ROM;
114 000096 ; it returns the address of the parameter
field.
115 000000 PUBLIC DOROM
116 000096 DOROM: ; -- a-addr ; Table in ROM: get PFA
into TOS
117 000096 2483 SUB #2,PSP
118 000098 84470000 MOV TOS,0(PSP)
119 00009C 0746 MOV W,TOS
120 00009E NEXT
120.1 00009E 3645 MOV @IP+,W // ; fetch word address
into W
120.2 0000A0 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
120.3 0000A2 ENDM
121 0000A2
122 0000A2 ;Z USER n -- define user variable
'n'
123 0000A2 ; (machine code fragment)
Flashable model
124 0000A2 HEADER USER,4,'user',DOCOLON
124.1 000000 PUBLIC USER
124.2 0000A2 .... DW link
124.3 0000A4 FF DB 0FFh ; not immediate
124.4 0000A5 link SET $
124.5 0000A5 04 DB 4
124.6 0000A6 75736572 DB 'user'
124.7 0000AA EVEN
124.8 0000AA IF 'DOCOLON'='DOCODE'
124.9 0000AA USER: DW $+2
124.10 0000AA ELSE
124.11 0000AA .... USER: DW DOCOLON
124.12 0000AC ENDIF
124.13 0000AC ENDM
125 0000AC ............ DW BUILDS,ICOMMA,XDOES
126 000000 PUBLIC DOUSER
127 0000B2 DOUSER: ; -- a-addr ; add constant to User
Pointer, result in TOS
128 0000B2 2483 SUB #2,PSP
129 0000B4 84470000 MOV TOS,0(PSP)
130 0000B8 2746 MOV @W,TOS
131 0000BA 1752.... ADD &UP,TOS
132 0000BE NEXT
132.1 0000BE 3645 MOV @IP+,W // ; fetch word address
into W
132.2 0000C0 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
132.3 0000C2 ENDM
133 0000C2
134 0000C2 ; DOALIAS used to build a word which performs
the action of
135 0000C2 ; another word. Its action is to fetch the
"alias" CFA from
136 0000C2 ; the parameter field, and execute that, e.g.
DOES> I@ EXECUTE ;
137 0000C2 ; This is currently used only within the Forth
kernel.
138 000000 PUBLIC DOALIAS
139 0000C2 DOALIAS: ; -- ; fetch CFA of word to
execute
140 0000C2 2646 MOV @W,W ; 2 fetch from parameter
field to W
141 0000C4 3046 MOV @W+,PC ; 2 fetch code address
into PC, W=PFA
142 0000C6
143 0000C6 ; DODOES is the code action of a DOES> clause.
For ITC Forth:
144 0000C6 ; defined word: CFA: doescode
145 0000C6 ; PFA: parameter field
146 0000C6 ;
147 0000C6 ; doescode: MOV #DODOES,PC ; 16-bit direct
jump, in two cells
148 0000C6 ; high-level thread
149 0000C6 ;
150 0000C6 ; Note that we use JMP DODOES instead of CALL
#DODOES because we can
151 0000C6 ; efficiently obtain the thread address. DODOES
is entered with W=PFA.
152 0000C6 ; It enters the high-level thread with the
address of the parameter
153 0000C6 ; field on top of stack.
154 0000C6
155 000000 PUBLIC dodoes
156 0000C6 dodoes: ; -- a-addr ; 3 for MOV #DODOES,PC
157 0000C6 2483 SUB #2,PSP ; 1 make room on
stack
158 0000C8 84470000 MOV TOS,0(PSP) ; 4
159 0000CC 0746 MOV W,TOS ; 1 put defined word's
PFA in TOS
160 0000CE 0512 PUSH IP ; 3 save old IP on
return stack
161 0000D0 1546FEFF MOV -2(W),IP ; 3 fetch adrs of
doescode from defined
word
162 0000D4 2552 ADD #4,IP ; 1 skip MOV instruction
to get thread
adrs
163 0000D6 NEXT ; 4
163.1 0000D6 3645 MOV @IP+,W // ; fetch word address
into W
163.2 0000D8 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
163.3 0000DA ENDM
164 0000DA
165 0000DA ; OPTION 1 ; OPTION 2
166 0000DA ; MOV #DODOES,PC 3 ; CALL #DODOES
5
167 0000DA ; ... ; ...
168 0000DA ; PUSH IP 3 ; POP W
2
169 0000DA ; MOVE -2(W),IP 3 ; PUSH IP
3
170 0000DA ; ADD #4,IP 1 ; MOV W,IP
1
171 0000DA
172 0000DA
173 0000DA ; ----------------------------------------------
------------------------
174 0000DA ; STACK OPERATIONS
175 0000DA
176 0000DA ;C DUP x -- x x duplicate top of
stack
177 0000DA HEADER DUP,3,'dup',DOCODE
177.1 000000 PUBLIC DUP
177.2 0000DA .... DW link
177.3 0000DC FF DB 0FFh ; not immediate
177.4 0000DD link SET $
177.5 0000DD 03 DB 3
177.6 0000DE 647570 DB 'dup'
177.7 0000E1 00 EVEN
177.8 0000E2 IF 'DOCODE'='DOCODE'
177.9 0000E2 .... DUP: DW $+2
177.10 0000E4 ELSE
177.11 0000E4 DUP: DW DOCODE
177.12 0000E4 ENDIF
177.13 0000E4 ENDM
178 0000E4 2483 PUSHTOS: SUB #2,PSP ; 1 push old
TOS..
179 0000E6 84470000 MOV TOS,0(PSP) ; 4 ..onto
stack
180 0000EA NEXT ; 4
180.1 0000EA 3645 MOV @IP+,W // ; fetch word address
into
W
180.2 0000EC 3046 MOV @W+,PC // ; fetch code address
into PC,
W=PFA
180.3 0000EE ENDM
181 0000EE
182 0000EE ;C ?DUP x -- 0 | x x DUP if nonzero
183 0000EE HEADER QDUP,4,'?dup',DOCODE
183.1 000000 PUBLIC QDUP
183.2 0000EE .... DW link
183.3 0000F0 FF DB 0FFh ; not immediate
183.4 0000F1 link SET $
183.5 0000F1 04 DB 4
183.6 0000F2 3F647570 DB '?dup'
183.7 0000F6 EVEN
183.8 0000F6 IF 'DOCODE'='DOCODE'
183.9 0000F6 .... QDUP: DW $+2
183.10 0000F8 ELSE
183.11 0000F8 QDUP: DW DOCODE
183.12 0000F8 ENDIF
183.13 0000F8 ENDM
184 0000F8 0793 CMP #0,TOS ; 1 test for
TOS nonzero
185 0000FA F423 JNZ PUSHTOS ; 2
186 0000FC NODUP: NEXT ; 4
186.1 0000FC 3645 MOV @IP+,W // ; fetch word address
into
W
186.2 0000FE 3046 MOV @W+,PC // ; fetch code address
into PC,
W=PFA
186.3 000100 ENDM
187 000100
188 000100 ;C DROP x -- drop top of stack
189 000100 HEADER DROP,4,'drop',DOCODE
189.1 000000 PUBLIC DROP
189.2 000100 .... DW link
189.3 000102 FF DB 0FFh ; not immediate
189.4 000103 link SET $
189.5 000103 04 DB 4
189.6 000104 64726F70 DB 'drop'
189.7 000108 EVEN
189.8 000108 IF 'DOCODE'='DOCODE'
189.9 000108 .... DROP: DW $+2
189.10 00010A ELSE
189.11 00010A DROP: DW DOCODE
189.12 00010A ENDIF
189.13 00010A ENDM
190 00010A 3744 MOV @PSP+,TOS ; 2
191 00010C NEXT ; 4
191.1 00010C 3645 MOV @IP+,W // ; fetch word address
into
W
191.2 00010E 3046 MOV @W+,PC // ; fetch code address
into PC,
W=PFA
191.3 000110 ENDM
192 000110
193 000110 ;C SWAP x1 x2 -- x2 x1 swap top two
items
194 000110 HEADER SWAP,4,'swap',DOCODE
194.1 000000 PUBLIC SWAP
194.2 000110 .... DW link
194.3 000112 FF DB 0FFh ; not immediate
194.4 000113 link SET $
194.5 000113 04 DB 4
194.6 000114 73776170 DB 'swap'
194.7 000118 EVEN
194.8 000118 IF 'DOCODE'='DOCODE'
194.9 000118 .... SWAP: DW $+2
194.10 00011A ELSE
194.11 00011A SWAP: DW DOCODE
194.12 00011A ENDIF
194.13 00011A ENDM
195 00011A 2644 MOV @PSP,W ; 2
196 00011C 84470000 MOV TOS,0(PSP) ; 4
197 000120 0746 MOV W,TOS ; 1
198 000122 NEXT ; 4
198.1 000122 3645 MOV @IP+,W // ; fetch word address
into
W
198.2 000124 3046 MOV @W+,PC // ; fetch code address
into PC,
W=PFA
198.3 000126 ENDM
199 000126
200 000126 ;C OVER x1 x2 -- x1 x2 x1 per stack
diagram
201 000126 HEADER OVER,4,'over',DOCODE
201.1 000000 PUBLIC OVER
201.2 000126 .... DW link
201.3 000128 FF DB 0FFh ; not immediate
201.4 000129 link SET $
201.5 000129 04 DB 4
201.6 00012A 6F766572 DB 'over'
201.7 00012E EVEN
201.8 00012E IF 'DOCODE'='DOCODE'
201.9 00012E .... OVER: DW $+2
201.10 000130 ELSE
201.11 000130 OVER: DW DOCODE
201.12 000130 ENDIF
201.13 000130 ENDM
202 000130 2644 MOV @PSP,W ; 2
203 000132 2483 SUB #2,PSP ; 2
204 000134 84470000 MOV TOS,0(PSP) ; 4
205 000138 0746 MOV W,TOS ; 1
206 00013A NEXT ; 4
206.1 00013A 3645 MOV @IP+,W // ; fetch word address
into
W
206.2 00013C 3046 MOV @W+,PC // ; fetch code address
into PC,
W=PFA
206.3 00013E ENDM
207 00013E
208 00013E ;C ROT x1 x2 x3 -- x2 x3 x1 per stack
diagram
209 00013E HEADER ROT,3,'rot',DOCODE
209.1 000000 PUBLIC ROT
209.2 00013E .... DW link
209.3 000140 FF DB 0FFh ; not immediate
209.4 000141 link SET $
209.5 000141 03 DB 3
209.6 000142 726F74 DB 'rot'
209.7 000145 00 EVEN
209.8 000146 IF 'DOCODE'='DOCODE'
209.9 000146 .... ROT: DW $+2
209.10 000148 ELSE
209.11 000148 ROT: DW DOCODE
209.12 000148 ENDIF
209.13 000148 ENDM
210 000148 2644 MOV @PSP,W ; 2 fetch
x2
211 00014A 84470000 MOV TOS,0(PSP) ; 4 store
x3
212 00014E 17440200 MOV 2(PSP),TOS ; 3 fetch
x1
213 000152 84460200 MOV W,2(PSP) ; 4 store
x2
214 000156 NEXT ; 4
214.1 000156 3645 MOV @IP+,W // ; fetch word address
into
W
214.2 000158 3046 MOV @W+,PC // ; fetch code address
into PC,
W=PFA
214.3 00015A ENDM
215 00015A
216 00015A ;X NIP x1 x2 -- x2 per stack
diagram
217 00015A HEADER NIP,3,'nip',DOCODE
217.1 000000 PUBLIC NIP
217.2 00015A .... DW link
217.3 00015C FF DB 0FFh ; not immediate
217.4 00015D link SET $
217.5 00015D 03 DB 3
217.6 00015E 6E6970 DB 'nip'
217.7 000161 00 EVEN
217.8 000162 IF 'DOCODE'='DOCODE'
217.9 000162 .... NIP: DW $+2
217.10 000164 ELSE
217.11 000164 NIP: DW DOCODE
217.12 000164 ENDIF
217.13 000164 ENDM
218 000164 2453 ADD #2,PSP ; 1
219 000166 NEXT ; 4
219.1 000166 3645 MOV @IP+,W // ; fetch word address
into
W
219.2 000168 3046 MOV @W+,PC // ; fetch code address
into PC,
W=PFA
219.3 00016A ENDM
220 00016A
221 00016A ;C >R x -- R: -- x push to return
stack
222 00016A HEADER TOR,2,'>r',DOCODE
222.1 000000 PUBLIC TOR
222.2 00016A .... DW link
222.3 00016C FF DB 0FFh ; not immediate
222.4 00016D link SET $
222.5 00016D 02 DB 2
222.6 00016E 3E72 DB '>r'
222.7 000170 EVEN
222.8 000170 IF 'DOCODE'='DOCODE'
222.9 000170 .... TOR: DW $+2
222.10 000172 ELSE
222.11 000172 TOR: DW DOCODE
222.12 000172 ENDIF
222.13 000172 ENDM
223 000172 0712 PUSH TOS
224 000174 3744 MOV @PSP+,TOS
225 000176 NEXT
225.1 000176 3645 MOV @IP+,W // ; fetch word address
into W
225.2 000178 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
225.3 00017A ENDM
226 00017A
227 00017A ;C R> -- x R: x -- pop from return
stack
228 00017A HEADER RFROM,2,'r>',DOCODE
228.1 000000 PUBLIC RFROM
228.2 00017A .... DW link
228.3 00017C FF DB 0FFh ; not immediate
228.4 00017D link SET $
228.5 00017D 02 DB 2
228.6 00017E 723E DB 'r>'
228.7 000180 EVEN
228.8 000180 IF 'DOCODE'='DOCODE'
228.9 000180 .... RFROM: DW $+2
228.10 000182 ELSE
228.11 000182 RFROM: DW DOCODE
228.12 000182 ENDIF
228.13 000182 ENDM
229 000182 2483 SUB #2,PSP ; 2
230 000184 84470000 MOV TOS,0(PSP) ; 4
231 000188 3741 MOV @RSP+,TOS
232 00018A NEXT
232.1 00018A 3645 MOV @IP+,W // ; fetch word address
into W
232.2 00018C 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
232.3 00018E ENDM
233 00018E
234 00018E ;C R@ -- x R: x -- x fetch from rtn
stk
235 00018E HEADER RFETCH,2,'r@',DOCODE
235.1 000000 PUBLIC RFETCH
235.2 00018E .... DW link
235.3 000190 FF DB 0FFh ; not immediate
235.4 000191 link SET $
235.5 000191 02 DB 2
235.6 000192 7240 DB 'r@'
235.7 000194 EVEN
235.8 000194 IF 'DOCODE'='DOCODE'
235.9 000194 .... RFETCH: DW $+2
235.10 000196 ELSE
235.11 000196 RFETCH: DW DOCODE
235.12 000196 ENDIF
235.13 000196 ENDM
236 000196 2483 SUB #2,PSP
237 000198 84470000 MOV TOS,0(PSP)
238 00019C 2741 MOV @RSP,TOS
239 00019E NEXT
239.1 00019E 3645 MOV @IP+,W // ; fetch word address
into W
239.2 0001A0 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
239.3 0001A2 ENDM
240 0001A2
241 0001A2 ;Z SP@ -- a-addr get data stack
pointer
242 0001A2 HEADER SPFETCH,3,'sp@',DOCODE
242.1 000000 PUBLIC SPFETCH
242.2 0001A2 .... DW link
242.3 0001A4 FF DB 0FFh ; not immediate
242.4 0001A5 link SET $
242.5 0001A5 03 DB 3
242.6 0001A6 737040 DB 'sp@'
242.7 0001A9 00 EVEN
242.8 0001AA IF 'DOCODE'='DOCODE'
242.9 0001AA .... SPFETCH: DW $+2
242.10 0001AC ELSE
242.11 0001AC SPFETCH: DW DOCODE
242.12 0001AC ENDIF
242.13 0001AC ENDM
243 0001AC 2483 SUB #2,PSP
244 0001AE 84470000 MOV TOS,0(PSP)
245 0001B2 0744 MOV PSP,TOS
246 0001B4 NEXT
246.1 0001B4 3645 MOV @IP+,W // ; fetch word address
into W
246.2 0001B6 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
246.3 0001B8 ENDM
247 0001B8
248 0001B8 ;Z SP! a-addr -- set data stack
pointer
249 0001B8 HEADER SPSTORE,3,'sp!',DOCODE
249.1 000000 PUBLIC SPSTORE
249.2 0001B8 .... DW link
249.3 0001BA FF DB 0FFh ; not immediate
249.4 0001BB link SET $
249.5 0001BB 03 DB 3
249.6 0001BC 737021 DB 'sp!'
249.7 0001BF 00 EVEN
249.8 0001C0 IF 'DOCODE'='DOCODE'
249.9 0001C0 .... SPSTORE: DW $+2
249.10 0001C2 ELSE
249.11 0001C2 SPSTORE: DW DOCODE
249.12 0001C2 ENDIF
249.13 0001C2 ENDM
250 0001C2 0447 MOV TOS,PSP
251 0001C4 3744 MOV @PSP+,TOS ; 2
252 0001C6 NEXT
252.1 0001C6 3645 MOV @IP+,W // ; fetch word address
into W
252.2 0001C8 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
252.3 0001CA ENDM
253 0001CA
254 0001CA ;Z RP@ -- a-addr get return stack
pointer
255 0001CA HEADER RPFETCH,3,'rp@',DOCODE
255.1 000000 PUBLIC RPFETCH
255.2 0001CA .... DW link
255.3 0001CC FF DB 0FFh ; not immediate
255.4 0001CD link SET $
255.5 0001CD 03 DB 3
255.6 0001CE 727040 DB 'rp@'
255.7 0001D1 00 EVEN
255.8 0001D2 IF 'DOCODE'='DOCODE'
255.9 0001D2 .... RPFETCH: DW $+2
255.10 0001D4 ELSE
255.11 0001D4 RPFETCH: DW DOCODE
255.12 0001D4 ENDIF
255.13 0001D4 ENDM
256 0001D4 2483 SUB #2,PSP
257 0001D6 84470000 MOV TOS,0(PSP)
258 0001DA 0741 MOV RSP,TOS
259 0001DC NEXT
259.1 0001DC 3645 MOV @IP+,W // ; fetch word address
into W
259.2 0001DE 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
259.3 0001E0 ENDM
260 0001E0
261 0001E0 ;Z RP! a-addr -- set return stack
pointer
262 0001E0 HEADER RPSTORE,3,'rp!',DOCODE
262.1 000000 PUBLIC RPSTORE
262.2 0001E0 .... DW link
262.3 0001E2 FF DB 0FFh ; not immediate
262.4 0001E3 link SET $
262.5 0001E3 03 DB 3
262.6 0001E4 727021 DB 'rp!'
262.7 0001E7 00 EVEN
262.8 0001E8 IF 'DOCODE'='DOCODE'
262.9 0001E8 .... RPSTORE: DW $+2
262.10 0001EA ELSE
262.11 0001EA RPSTORE: DW DOCODE
262.12 0001EA ENDIF
262.13 0001EA ENDM
263 0001EA 0147 MOV TOS,RSP
264 0001EC 3744 MOV @PSP+,TOS ; 2
265 0001EE NEXT
265.1 0001EE 3645 MOV @IP+,W // ; fetch word address
into W
265.2 0001F0 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
265.3 0001F2 ENDM
266 0001F2
267 0001F2 ;X TUCK x1 x2 -- x2 x1 x2 per stack
diagram
268 0001F2 HEADER TUCK,4,'tuck',DOCOLON
268.1 000000 PUBLIC TUCK
268.2 0001F2 .... DW link
268.3 0001F4 FF DB 0FFh ; not immediate
268.4 0001F5 link SET $
268.5 0001F5 04 DB 4
268.6 0001F6 7475636B DB 'tuck'
268.7 0001FA EVEN
268.8 0001FA IF 'DOCOLON'='DOCODE'
268.9 0001FA TUCK: DW $+2
268.10 0001FA ELSE
268.11 0001FA .... TUCK: DW DOCOLON
268.12 0001FC ENDIF
268.13 0001FC ENDM
269 0001FC ............ DC16 SWAP,OVER,EXIT
270 000202
271 000202 ; ----------------------------------------------
------------------------
272 000202 ; MEMORY OPERATIONS
273 000202
274 000202 ;C @ a-addr -- x fetch cell from
memory
275 000202 HEADER FETCH,1,'@',DOCODE
275.1 000000 PUBLIC FETCH
275.2 000202 .... DW link
275.3 000204 FF DB 0FFh ; not immediate
275.4 000205 link SET $
275.5 000205 01 DB 1
275.6 000206 40 DB '@'
275.7 000207 00 EVEN
275.8 000208 IF 'DOCODE'='DOCODE'
275.9 000208 .... FETCH: DW $+2
275.10 00020A ELSE
275.11 00020A FETCH: DW DOCODE
275.12 00020A ENDIF
275.13 00020A ENDM
276 00020A 2747 MOV @TOS,TOS
277 00020C NEXT
277.1 00020C 3645 MOV @IP+,W // ; fetch word address
into W
277.2 00020E 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
277.3 000210 ENDM
278 000210
279 000210 ;C ! x a-addr -- store cell in
memory
280 000210 HEADER STORE,1,'!',DOCODE
280.1 000000 PUBLIC STORE
280.2 000210 .... DW link
280.3 000212 FF DB 0FFh ; not immediate
280.4 000213 link SET $
280.5 000213 01 DB 1
280.6 000214 21 DB '!'
280.7 000215 00 EVEN
280.8 000216 IF 'DOCODE'='DOCODE'
280.9 000216 .... STORE: DW $+2
280.10 000218 ELSE
280.11 000218 STORE: DW DOCODE
280.12 000218 ENDIF
280.13 000218 ENDM
281 000218 B7440000 MOV @PSP+,0(TOS)
282 00021C 3744 MOV @PSP+,TOS
283 00021E NEXT
283.1 00021E 3645 MOV @IP+,W // ; fetch word address
into W
283.2 000220 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
283.3 000222 ENDM
284 000222
285 000222 ;C C@ c-addr -- char fetch char from
memory
286 000222 HEADER CFETCH,2,'c@',DOCODE
286.1 000000 PUBLIC CFETCH
286.2 000222 .... DW link
286.3 000224 FF DB 0FFh ; not immediate
286.4 000225 link SET $
286.5 000225 02 DB 2
286.6 000226 6340 DB 'c@'
286.7 000228 EVEN
286.8 000228 IF 'DOCODE'='DOCODE'
286.9 000228 .... CFETCH: DW $+2
286.10 00022A ELSE
286.11 00022A CFETCH: DW DOCODE
286.12 00022A ENDIF
286.13 00022A ENDM
287 00022A 6747 MOV.B @TOS,TOS
288 00022C NEXT
288.1 00022C 3645 MOV @IP+,W // ; fetch word address
into W
288.2 00022E 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
288.3 000230 ENDM
289 000230
290 000230 ;C C! char c-addr -- store char in
memory
291 000230 HEADER CSTORE,2,'c!',DOCODE
291.1 000000 PUBLIC CSTORE
291.2 000230 .... DW link
291.3 000232 FF DB 0FFh ; not immediate
291.4 000233 link SET $
291.5 000233 02 DB 2
291.6 000234 6321 DB 'c!'
291.7 000236 EVEN
291.8 000236 IF 'DOCODE'='DOCODE'
291.9 000236 .... CSTORE: DW $+2
291.10 000238 ELSE
291.11 000238 CSTORE: DW DOCODE
291.12 000238 ENDIF
291.13 000238 ENDM
292 000238 3644 MOV @PSP+,W
293 00023A C7460000 MOV.B W,0(TOS)
294 00023E 3744 MOV @PSP+,TOS
295 000240 NEXT
295.1 000240 3645 MOV @IP+,W // ; fetch word address
into W
295.2 000242 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
295.3 000244 ENDM
296 000244
297 000244 ; FLASH MEMORY OPERATIONS
298 000244 ; Note that an I! or IC! to a RAM address
>FLASHSTART will work -- it
299 000244 ; will enable the flash, write the RAM, and then
disable the flash.
300 000244 ; An FLERASE to a RAM address will merely clear
that one RAM cell.
301 000244
302 000244 ;Z FLERASE a-addr n --
303 000244 HEADER FLERASE,7,'flerase',DOCODE
303.1 000000 PUBLIC FLERASE
303.2 000244 .... DW link
303.3 000246 FF DB 0FFh ; not immediate
303.4 000247 link SET $
303.5 000247 07 DB 7
303.6 000248 666C65726173* DB 'flerase'
303.7 00024F 00 EVEN
303.8 000250 IF 'DOCODE'='DOCODE'
303.9 000250 .... FLERASE: DW $+2
303.10 000252 ELSE
303.11 000252 FLERASE: DW DOCODE
303.12 000252 ENDIF
303.13 000252 ENDM
304 000252 3644 MOV @PSP+,W ; get address in
W
305 000254 0756 ADD W,TOS ; TOS=end adrs
(first unerased
adrs)
306 000256 FLE_1:
307 000256 0697 CMP TOS,W ; adr-end
308 000258 272C JC FLE_X ; if no borrow,
adr>=end, do
not erase
309 00025A ; is it within Main flash?
310 00025A 369000C0 CMP #FLASHSTART,W ; flash
start
311 00025E 0328 JNC FLE_INFO ; if borrow,
adrend, check
if Info
314 000266 FLE_INFO: ; is it within Info flash?
315 000266 36900010 CMP #INFOSTART,W
316 00026A 1E28 JNC FLE_X ; if borrow,
adrend, do not
erase
319 000272 FLE_OK: ; Address is either in Main flash, or in
Info flash.
320 000272 ; Segment Erase from flash.
321 000272 ; Assumes ACCVIE = NMIIE = OFIE = 0,
watchdog disabled.
322 000272 ; Per section 5.3.2 of MSP430 Family
User's Guide
323 000272 32C2 DINT ; Disable
interrupts
324 000274 B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear
LOCK
325 00027A B24002A52801 MOV #FWKEY+ERASE,&FCTL1 ; Enable segment
erase
326 000280 B6430000 MOV #-1,0(W) ; Dummy write in
segment to
erase
327 000284 B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear
erase
command.
328 00028A B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Done, set
LOCK
329 000290 32D2 EINT ; Enable
interrupts
330 000292 ; Advance flash pointer by 512 bytes or
128 bytes
331 000292 ; is it within Main flash?
332 000292 369000C0 CMP #FLASHSTART,W
333 000296 0528 JNC FL_INFO ; if borrow,
adrend, must
be Info
336 00029E 36508001 ADD #(MAINSEG-INFOSEG),W
337 0002A2 36508000 FL_INFO: ADD #INFOSEG,W
338 0002A6 D73F JMP FLE_1 ; continue till
past end or
outside
limits
339 0002A8 3744 FLE_X: MOV @PSP+,TOS
340 0002AA NEXT
340.1 0002AA 3645 MOV @IP+,W // ; fetch word address
into W
340.2 0002AC 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
340.3 0002AE ENDM
341 0002AE
342 0002AE ; Program Space (Flash) operators
343 0002AE
344 0002AE ;Z I! x a-addr -- store cell in
Instruction memory
345 0002AE HEADER ISTORE,2,'i!',DOCODE
345.1 000000 PUBLIC ISTORE
345.2 0002AE .... DW link
345.3 0002B0 FF DB 0FFh ; not immediate
345.4 0002B1 link SET $
345.5 0002B1 02 DB 2
345.6 0002B2 6921 DB 'i!'
345.7 0002B4 EVEN
345.8 0002B4 IF 'DOCODE'='DOCODE'
345.9 0002B4 .... ISTORE: DW $+2
345.10 0002B6 ELSE
345.11 0002B6 ISTORE: DW DOCODE
345.12 0002B6 ENDIF
345.13 0002B6 ENDM
346 0002B6 3644 MOV @PSP+,W ; get data to
write
347 0002B8 17B3 BIT #1,TOS
348 0002BA 1E20 JNZ IST_X ; if not even
address, do not
write
349 0002BC 2697 CMP @TOS,W
350 0002BE 1C24 JZ IST_X ; if memory is
desired value,
do not
write
351 0002C0 ; is it within Main flash?
352 0002C0 379000C0 CMP #FLASHSTART,TOS
353 0002C4 0328 JNC IST_INFO ; if borrow,
adrend, check
if Info
356 0002CC IST_INFO: ; is it within Info flash?
357 0002CC 37900010 CMP #INFOSTART,TOS
358 0002D0 0A28 JNC IST_RAM ; if borrow,
adrend, assume
it's RAM
361 0002D8 IST_OK: ; Address is either in Main flash, or in
Info flash.
362 0002D8 ; Byte/word write from flash.
363 0002D8 ; Assumes location to write is already
erased
364 0002D8 ; Assumes ACCVIE = NMIIE = OFIE = 0,
watchdog disabled.
365 0002D8 ; Per section 5.3.3 of MSP430 Family
User's Guide
366 0002D8 32C2 DINT ; Disable
interrupts
367 0002DA B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear
LOCK
368 0002E0 B24040A52801 MOV #FWKEY+WRT,&FCTL1 ; Enable
write
369 0002E6 IST_RAM: ; If RAM, jump here to write.
FCTL1,FCTL3,EINT are superfluous
370 0002E6 87460000 MOV W,0(TOS) ; Write word to
flash
location
371 0002EA B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear
WRT.
372 0002F0 B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Set LOCK
373 0002F6 32D2 EINT ; Enable
interrupts
374 0002F8 3744 IST_X: MOV @PSP+,TOS ; pop new
TOS
375 0002FA NEXT
375.1 0002FA 3645 MOV @IP+,W // ; fetch word address
into W
375.2 0002FC 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
375.3 0002FE ENDM
376 0002FE
377 0002FE ;Z IC! x a-addr -- store char in
Instruction memory
378 0002FE HEADER ICSTORE,3,'ic!',DOCODE
378.1 000000 PUBLIC ICSTORE
378.2 0002FE .... DW link
378.3 000300 FF DB 0FFh ; not immediate
378.4 000301 link SET $
378.5 000301 03 DB 3
378.6 000302 696321 DB 'ic!'
378.7 000305 00 EVEN
378.8 000306 IF 'DOCODE'='DOCODE'
378.9 000306 .... ICSTORE: DW $+2
378.10 000308 ELSE
378.11 000308 ICSTORE: DW DOCODE
378.12 000308 ENDIF
378.13 000308 ENDM
379 000308 3644 MOV @PSP+,W ; get data to
write
380 00030A 6697 CMP.B @TOS,W
381 00030C F527 JZ IST_X ; if memory is
desired value,
do not
write
382 00030E ; is it within Main flash?
383 00030E 379000C0 CMP #FLASHSTART,TOS
384 000312 0328 JNC ICST_INFO ; if borrow,
adrend, check
if Info
387 00031A ICST_INFO: ; is it within Info flash?
388 00031A 37900010 CMP #INFOSTART,TOS
389 00031E 0A28 JNC ICST_RAM ; if borrow,
adrend, assume
it's RAM
392 000326 ICST_OK: ; Address is either in Main flash, or
in Info flash.
393 000326 ; Byte/word write from flash.
394 000326 ; Assumes location to write is already
erased
395 000326 ; Assumes ACCVIE = NMIIE = OFIE = 0,
watchdog disabled.
396 000326 ; Per section 5.3.3 of MSP430 Family
User's Guide
397 000326 32C2 DINT ; Disable
interrupts
398 000328 B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear
LOCK
399 00032E B24040A52801 MOV #FWKEY+WRT,&FCTL1 ; Enable
write
400 000334 ICST_RAM: ; If RAM, jump here to write.
FCTL1,FCTL3,EINT are superfluous
401 000334 C7460000 MOV.B W,0(TOS) ; Write byte to
flash
location
402 000338 B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear
WRT.
403 00033E B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Set LOCK
404 000344 32D2 EINT ; Enable
interrupts
405 000346 D83F JMP IST_X
406 000348
407 000348 ;Z I@ a-addr -- x fetch cell from
Instruction memory
408 000348 HEADER IFETCH,2,'i@',FETCH+2
408.1 000000 PUBLIC IFETCH
408.2 000348 .... DW link
408.3 00034A FF DB 0FFh ; not immediate
408.4 00034B link SET $
408.5 00034B 02 DB 2
408.6 00034C 6940 DB 'i@'
408.7 00034E EVEN
408.8 00034E IF 'FETCH+2'='DOCODE'
408.9 00034E IFETCH: DW $+2
408.10 00034E ELSE
408.11 00034E .... IFETCH: DW FETCH+2
408.12 000350 ENDIF
408.13 000350 ENDM
409 000350
410 000350 ;Z IC@ a-addr -- x fetch char from
Instruction memory
411 000350 HEADER ICFETCH,3,'ic@',CFETCH+2
411.1 000000 PUBLIC ICFETCH
411.2 000350 .... DW link
411.3 000352 FF DB 0FFh ; not immediate
411.4 000353 link SET $
411.5 000353 03 DB 3
411.6 000354 696340 DB 'ic@'
411.7 000357 00 EVEN
411.8 000358 IF 'CFETCH+2'='DOCODE'
411.9 000358 ICFETCH: DW $+2
411.10 000358 ELSE
411.11 000358 .... ICFETCH: DW CFETCH+2
411.12 00035A ENDIF
411.13 00035A ENDM
412 00035A
413 00035A ;Z D->I c-addr1 c-addr2 u -- move
Data->Code
414 00035A ; Block move from Data space to Code space.
Flashable.
415 00035A ; For the MSP430, this uses a "smart" algorithm
that uses word writes,
416 00035A ; rather than byte writes, whenever possible.
Note that byte reads
417 00035A ; are used for the source, so it need not be
aligned.
418 00035A HEADER DTOI,4,'d->i',DOCODE
418.1 000000 PUBLIC DTOI
418.2 00035A .... DW link
418.3 00035C FF DB 0FFh ; not immediate
418.4 00035D link SET $
418.5 00035D 04 DB 4
418.6 00035E 642D3E69 DB 'd->i'
418.7 000362 EVEN
418.8 000362 IF 'DOCODE'='DOCODE'
418.9 000362 .... DTOI: DW $+2
418.10 000364 ELSE
418.11 000364 DTOI: DW DOCODE
418.12 000364 ENDIF
418.13 000364 ENDM
419 000364 3644 MOV @PSP+,W ; dest adrs
420 000366 3A44 MOV @PSP+,X ; src adrs
421 000368 0793 CMP #0,TOS
422 00036A 2024 JZ DTOI_X
423 00036C DTOI_LOOP: ; Begin flash write sequence
424 00036C 32C2 DINT ; Disable
interrupts
425 00036E B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear
LOCK
426 000374 B24040A52801 MOV #FWKEY+WRT,&FCTL1 ; Enable
write
427 00037A ; If length is 1, or dest. address is
odd, do a byte write.
428 00037A ; Else, do a word write.
429 00037A 1793 CMP #1,TOS
430 00037C 0B24 JZ DTOI_BYTE
431 00037E 16B3 BIT #1,W
432 000380 0920 JNZ DTOI_BYTE
433 000382 7B4A DTOI_WORD: MOV.B @X+,Y ; get low byte
of word
434 000384 7C4A MOV.B @X+,Q ; get high byte
of word
435 000386 8C10 SWPB Q
436 000388 0BDC BIS Q,Y ; merge
bytes
437 00038A 864B0000 MOV.W Y,0(W) ; write byte to
dest
438 00038E 2653 ADD #2,W
439 000390 1783 SUB #1,TOS ; another 1 will
be subtracted
below
440 000392 033C JMP DTOI_END
441 000394 F64A0000 DTOI_BYTE: MOV.B @X+,0(W) ; copy byte from
src to
dest
442 000398 1653 ADD #1,W
443 00039A DTOI_END: ; End flash write sequence
444 00039A B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear
WRT.
445 0003A0 B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Set LOCK
446 0003A6 32D2 EINT ; Enable
interrupts
447 0003A8 1783 SUB #1,TOS
448 0003AA E023 JNZ DTOI_LOOP
449 0003AC 3744 DTOI_X: MOV @PSP+,TOS ; pop new
TOS
450 0003AE NEXT
450.1 0003AE 3645 MOV @IP+,W // ; fetch word address
into W
450.2 0003B0 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
450.3 0003B2 ENDM
451 0003B2
452 0003B2 ; ----------------------------------------------
------------------------
453 0003B2 ; ARITHMETIC OPERATIONS
454 0003B2
455 0003B2 ;C + n1/u1 n2/u2 -- n3/u3 add
n1+n2
456 0003B2 HEADER PLUS,1,'+',DOCODE
456.1 000000 PUBLIC PLUS
456.2 0003B2 .... DW link
456.3 0003B4 FF DB 0FFh ; not immediate
456.4 0003B5 link SET $
456.5 0003B5 01 DB 1
456.6 0003B6 2B DB '+'
456.7 0003B7 00 EVEN
456.8 0003B8 IF 'DOCODE'='DOCODE'
456.9 0003B8 .... PLUS: DW $+2
456.10 0003BA ELSE
456.11 0003BA PLUS: DW DOCODE
456.12 0003BA ENDIF
456.13 0003BA ENDM
457 0003BA 3754 ADD @PSP+,TOS
458 0003BC NEXT
458.1 0003BC 3645 MOV @IP+,W // ; fetch word address
into W
458.2 0003BE 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
458.3 0003C0 ENDM
459 0003C0
460 0003C0 ;C +! n/u a-addr -- add cell to
memory
461 0003C0 HEADER PLUSSTORE,2,'+!',DOCODE
461.1 000000 PUBLIC PLUSSTORE
461.2 0003C0 .... DW link
461.3 0003C2 FF DB 0FFh ; not immediate
461.4 0003C3 link SET $
461.5 0003C3 02 DB 2
461.6 0003C4 2B21 DB '+!'
461.7 0003C6 EVEN
461.8 0003C6 IF 'DOCODE'='DOCODE'
461.9 0003C6 .... PLUSSTORE: DW $+2
461.10 0003C8 ELSE
461.11 0003C8 PLUSSTORE: DW DOCODE
461.12 0003C8 ENDIF
461.13 0003C8 ENDM
462 0003C8 B7540000 ADD @PSP+,0(TOS)
463 0003CC 3744 MOV @PSP+,TOS
464 0003CE NEXT
464.1 0003CE 3645 MOV @IP+,W // ; fetch word address
into W
464.2 0003D0 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
464.3 0003D2 ENDM
465 0003D2
466 0003D2 ;X M+ d n -- d add single to
double
467 0003D2 HEADER MPLUS,2,'m+',DOCODE
467.1 000000 PUBLIC MPLUS
467.2 0003D2 .... DW link
467.3 0003D4 FF DB 0FFh ; not immediate
467.4 0003D5 link SET $
467.5 0003D5 02 DB 2
467.6 0003D6 6D2B DB 'm+'
467.7 0003D8 EVEN
467.8 0003D8 IF 'DOCODE'='DOCODE'
467.9 0003D8 .... MPLUS: DW $+2
467.10 0003DA ELSE
467.11 0003DA MPLUS: DW DOCODE
467.12 0003DA ENDIF
467.13 0003DA ENDM
468 0003DA 84570200 ADD TOS,2(PSP)
469 0003DE 84630000 ADDC #0,0(PSP)
470 0003E2 3744 MOV @PSP+,TOS
471 0003E4 NEXT
471.1 0003E4 3645 MOV @IP+,W // ; fetch word address
into W
471.2 0003E6 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
471.3 0003E8 ENDM
472 0003E8
473 0003E8 ;C - n1/u1 n2/u2 -- n3/u3 subtract
n1-n2
474 0003E8 HEADER MINUS,1,'-',DOCODE
474.1 000000 PUBLIC MINUS
474.2 0003E8 .... DW link
474.3 0003EA FF DB 0FFh ; not immediate
474.4 0003EB link SET $
474.5 0003EB 01 DB 1
474.6 0003EC 2D DB '-'
474.7 0003ED 00 EVEN
474.8 0003EE IF 'DOCODE'='DOCODE'
474.9 0003EE .... MINUS: DW $+2
474.10 0003F0 ELSE
474.11 0003F0 MINUS: DW DOCODE
474.12 0003F0 ENDIF
474.13 0003F0 ENDM
475 0003F0 3644 MOV @PSP+,W
476 0003F2 0687 SUB TOS,W
477 0003F4 0746 MOV W,TOS
478 0003F6 NEXT
478.1 0003F6 3645 MOV @IP+,W // ; fetch word address
into W
478.2 0003F8 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
478.3 0003FA ENDM
479 0003FA
480 0003FA ;C AND x1 x2 -- x3 logical
AND
481 0003FA HEADER ANDD,3,'and',DOCODE
481.1 000000 PUBLIC ANDD
481.2 0003FA .... DW link
481.3 0003FC FF DB 0FFh ; not immediate
481.4 0003FD link SET $
481.5 0003FD 03 DB 3
481.6 0003FE 616E64 DB 'and'
481.7 000401 00 EVEN
481.8 000402 IF 'DOCODE'='DOCODE'
481.9 000402 .... ANDD: DW $+2
481.10 000404 ELSE
481.11 000404 ANDD: DW DOCODE
481.12 000404 ENDIF
481.13 000404 ENDM
482 000404 37F4 AND @PSP+,TOS
483 000406 NEXT
483.1 000406 3645 MOV @IP+,W // ; fetch word address
into W
483.2 000408 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
483.3 00040A ENDM
484 00040A
485 00040A ;C OR x1 x2 -- x3 logical
OR
486 00040A HEADER ORR,2,'or',DOCODE
486.1 000000 PUBLIC ORR
486.2 00040A .... DW link
486.3 00040C FF DB 0FFh ; not immediate
486.4 00040D link SET $
486.5 00040D 02 DB 2
486.6 00040E 6F72 DB 'or'
486.7 000410 EVEN
486.8 000410 IF 'DOCODE'='DOCODE'
486.9 000410 .... ORR: DW $+2
486.10 000412 ELSE
486.11 000412 ORR: DW DOCODE
486.12 000412 ENDIF
486.13 000412 ENDM
487 000412 37D4 BIS @PSP+,TOS
488 000414 NEXT
488.1 000414 3645 MOV @IP+,W // ; fetch word address
into W
488.2 000416 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
488.3 000418 ENDM
489 000418
490 000418 ;C XOR x1 x2 -- x3 logical
XOR
491 000418 HEADER XORR,3,'xor',DOCODE
491.1 000000 PUBLIC XORR
491.2 000418 .... DW link
491.3 00041A FF DB 0FFh ; not immediate
491.4 00041B link SET $
491.5 00041B 03 DB 3
491.6 00041C 786F72 DB 'xor'
491.7 00041F 00 EVEN
491.8 000420 IF 'DOCODE'='DOCODE'
491.9 000420 .... XORR: DW $+2
491.10 000422 ELSE
491.11 000422 XORR: DW DOCODE
491.12 000422 ENDIF
491.13 000422 ENDM
492 000422 37E4 XOR @PSP+,TOS
493 000424 NEXT
493.1 000424 3645 MOV @IP+,W // ; fetch word address
into W
493.2 000426 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
493.3 000428 ENDM
494 000428
495 000428 ;C INVERT x1 -- x2 bitwise
inversion
496 000428 HEADER INVERT,6,'invert',DOCODE
496.1 000000 PUBLIC INVERT
496.2 000428 .... DW link
496.3 00042A FF DB 0FFh ; not immediate
496.4 00042B link SET $
496.5 00042B 06 DB 6
496.6 00042C 696E76657274 DB 'invert'
496.7 000432 EVEN
496.8 000432 IF 'DOCODE'='DOCODE'
496.9 000432 .... INVERT: DW $+2
496.10 000434 ELSE
496.11 000434 INVERT: DW DOCODE
496.12 000434 ENDIF
496.13 000434 ENDM
497 000434 37E3 XOR #-1,TOS
498 000436 NEXT
498.1 000436 3645 MOV @IP+,W // ; fetch word address
into W
498.2 000438 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
498.3 00043A ENDM
499 00043A
500 00043A ;C NEGATE x1 -- x2 two's complement
501 00043A HEADER NEGATE,6,'negate',DOCODE
501.1 000000 PUBLIC NEGATE
501.2 00043A .... DW link
501.3 00043C FF DB 0FFh ; not immediate
501.4 00043D link SET $
501.5 00043D 06 DB 6
501.6 00043E 6E6567617465 DB 'negate'
501.7 000444 EVEN
501.8 000444 IF 'DOCODE'='DOCODE'
501.9 000444 .... NEGATE: DW $+2
501.10 000446 ELSE
501.11 000446 NEGATE: DW DOCODE
501.12 000446 ENDIF
501.13 000446 ENDM
502 000446 37E3 XOR #-1,TOS
503 000448 1753 ADD #1,TOS
504 00044A NEXT
504.1 00044A 3645 MOV @IP+,W // ; fetch word address
into W
504.2 00044C 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
504.3 00044E ENDM
505 00044E
506 00044E ;C 1+ n1/u1 -- n2/u2 add 1 to
TOS
507 00044E HEADER ONEPLUS,2,'1+',DOCODE
507.1 000000 PUBLIC ONEPLUS
507.2 00044E .... DW link
507.3 000450 FF DB 0FFh ; not immediate
507.4 000451 link SET $
507.5 000451 02 DB 2
507.6 000452 312B DB '1+'
507.7 000454 EVEN
507.8 000454 IF 'DOCODE'='DOCODE'
507.9 000454 .... ONEPLUS: DW $+2
507.10 000456 ELSE
507.11 000456 ONEPLUS: DW DOCODE
507.12 000456 ENDIF
507.13 000456 ENDM
508 000456 1753 ADD #1,TOS
509 000458 NEXT
509.1 000458 3645 MOV @IP+,W // ; fetch word address
into W
509.2 00045A 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
509.3 00045C ENDM
510 00045C
511 00045C ;C 1- n1/u1 -- n2/u2 subtract 1 from
TOS
512 00045C HEADER ONEMINUS,2,'1-',DOCODE
512.1 000000 PUBLIC ONEMINUS
512.2 00045C .... DW link
512.3 00045E FF DB 0FFh ; not immediate
512.4 00045F link SET $
512.5 00045F 02 DB 2
512.6 000460 312D DB '1-'
512.7 000462 EVEN
512.8 000462 IF 'DOCODE'='DOCODE'
512.9 000462 .... ONEMINUS: DW $+2
512.10 000464 ELSE
512.11 000464 ONEMINUS: DW DOCODE
512.12 000464 ENDIF
512.13 000464 ENDM
513 000464 1783 SUB #1,TOS
514 000466 NEXT
514.1 000466 3645 MOV @IP+,W // ; fetch word address
into W
514.2 000468 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
514.3 00046A ENDM
515 00046A
516 00046A ;Z >< x1 -- x2 swap bytes (not
ANSI)
517 00046A HEADER SWAPBYTES,2,'><',DOCODE
517.1 000000 PUBLIC SWAPBYTES
517.2 00046A .... DW link
517.3 00046C FF DB 0FFh ; not immediate
517.4 00046D link SET $
517.5 00046D 02 DB 2
517.6 00046E 3E3C DB '><'
517.7 000470 EVEN
517.8 000470 IF 'DOCODE'='DOCODE'
517.9 000470 .... SWAPBYTES: DW $+2
517.10 000472 ELSE
517.11 000472 SWAPBYTES: DW DOCODE
517.12 000472 ENDIF
517.13 000472 ENDM
518 000472 8710 SWPB TOS
519 000474 NEXT
519.1 000474 3645 MOV @IP+,W // ; fetch word address
into W
519.2 000476 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
519.3 000478 ENDM
520 000478
521 000478 ;C 2* x1 -- x2 arithmetic left
shift
522 000478 HEADER TWOSTAR,2,'2*',DOCODE
522.1 000000 PUBLIC TWOSTAR
522.2 000478 .... DW link
522.3 00047A FF DB 0FFh ; not immediate
522.4 00047B link SET $
522.5 00047B 02 DB 2
522.6 00047C 322A DB '2*'
522.7 00047E EVEN
522.8 00047E IF 'DOCODE'='DOCODE'
522.9 00047E .... TWOSTAR: DW $+2
522.10 000480 ELSE
522.11 000480 TWOSTAR: DW DOCODE
522.12 000480 ENDIF
522.13 000480 ENDM
523 000480 0757 ADD TOS,TOS
524 000482 NEXT
524.1 000482 3645 MOV @IP+,W // ; fetch word address
into W
524.2 000484 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
524.3 000486 ENDM
525 000486
526 000486 ;C 2/ x1 -- x2 arithmetic right
shift
527 000486 HEADER TWOSLASH,2,'2/',DOCODE
527.1 000000 PUBLIC TWOSLASH
527.2 000486 .... DW link
527.3 000488 FF DB 0FFh ; not immediate
527.4 000489 link SET $
527.5 000489 02 DB 2
527.6 00048A 322F DB '2/'
527.7 00048C EVEN
527.8 00048C IF 'DOCODE'='DOCODE'
527.9 00048C .... TWOSLASH: DW $+2
527.10 00048E ELSE
527.11 00048E TWOSLASH: DW DOCODE
527.12 00048E ENDIF
527.13 00048E ENDM
528 00048E 0711 RRA TOS
529 000490 NEXT
529.1 000490 3645 MOV @IP+,W // ; fetch word address
into W
529.2 000492 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
529.3 000494 ENDM
530 000494
531 000494 ;C LSHIFT x1 u -- x2 logical L shift u
places
532 000494 HEADER LSHIFT,6,'lshift',DOCODE
532.1 000000 PUBLIC LSHIFT
532.2 000494 .... DW link
532.3 000496 FF DB 0FFh ; not immediate
532.4 000497 link SET $
532.5 000497 06 DB 6
532.6 000498 6C7368696674 DB 'lshift'
532.7 00049E EVEN
532.8 00049E IF 'DOCODE'='DOCODE'
532.9 00049E .... LSHIFT: DW $+2
532.10 0004A0 ELSE
532.11 0004A0 LSHIFT: DW DOCODE
532.12 0004A0 ENDIF
532.13 0004A0 ENDM
533 0004A0 3644 MOV @PSP+,W
534 0004A2 37F01F00 AND #1Fh,TOS ; no need to
shift more than
16
535 0004A6 0324 JZ LSH_X
536 0004A8 0656 LSH_1: ADD W,W
537 0004AA 1783 SUB #1,TOS
538 0004AC FD23 JNZ LSH_1
539 0004AE 0746 LSH_X: MOV W,TOS
540 0004B0 NEXT
540.1 0004B0 3645 MOV @IP+,W // ; fetch word address
into W
540.2 0004B2 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
540.3 0004B4 ENDM
541 0004B4
542 0004B4 ;C RSHIFT x1 u -- x2 logical R shift u
places
543 0004B4 HEADER RSHIFT,6,'rshift',DOCODE
543.1 000000 PUBLIC RSHIFT
543.2 0004B4 .... DW link
543.3 0004B6 FF DB 0FFh ; not immediate
543.4 0004B7 link SET $
543.5 0004B7 06 DB 6
543.6 0004B8 727368696674 DB 'rshift'
543.7 0004BE EVEN
543.8 0004BE IF 'DOCODE'='DOCODE'
543.9 0004BE .... RSHIFT: DW $+2
543.10 0004C0 ELSE
543.11 0004C0 RSHIFT: DW DOCODE
543.12 0004C0 ENDIF
543.13 0004C0 ENDM
544 0004C0 3644 MOV @PSP+,W
545 0004C2 37F01F00 AND #1Fh,TOS ; no need to
shift more than
16
546 0004C6 0424 JZ RSH_X
547 0004C8 12C3 RSH_1: CLRC
548 0004CA 0610 RRC W
549 0004CC 1783 SUB #1,TOS
550 0004CE FC23 JNZ RSH_1
551 0004D0 0746 RSH_X: MOV W,TOS
552 0004D2 NEXT
552.1 0004D2 3645 MOV @IP+,W // ; fetch word address
into W
552.2 0004D4 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
552.3 0004D6 ENDM
553 0004D6
554 0004D6 ; ----------------------------------------------
------------------------
555 0004D6 ; COMPARISON OPERATIONS
556 0004D6
557 0004D6 ;C 0= n/u -- flag return true if
TOS=0
558 0004D6 HEADER ZEROEQUAL,2,'0=',DOCODE
558.1 000000 PUBLIC ZEROEQUAL
558.2 0004D6 .... DW link
558.3 0004D8 FF DB 0FFh ; not immediate
558.4 0004D9 link SET $
558.5 0004D9 02 DB 2
558.6 0004DA 303D DB '0='
558.7 0004DC EVEN
558.8 0004DC IF 'DOCODE'='DOCODE'
558.9 0004DC .... ZEROEQUAL: DW $+2
558.10 0004DE ELSE
558.11 0004DE ZEROEQUAL: DW DOCODE
558.12 0004DE ENDIF
558.13 0004DE ENDM
559 0004DE 1783 SUB #1,TOS ; borrow (clear cy)
if TOS was
0
560 0004E0 0777 SUBC TOS,TOS ; TOS=-1 if borrow
was set
561 0004E2 NEXT
561.1 0004E2 3645 MOV @IP+,W // ; fetch word address
into W
561.2 0004E4 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
561.3 0004E6 ENDM
562 0004E6
563 0004E6 ;C 0< n -- flag true if TOS negative
564 0004E6 HEADER ZEROLESS,2,'0<',DOCODE
564.1 000000 PUBLIC ZEROLESS
564.2 0004E6 .... DW link
564.3 0004E8 FF DB 0FFh ; not immediate
564.4 0004E9 link SET $
564.5 0004E9 02 DB 2
564.6 0004EA 303C DB '0<'
564.7 0004EC EVEN
564.8 0004EC IF 'DOCODE'='DOCODE'
564.9 0004EC .... ZEROLESS: DW $+2
564.10 0004EE ELSE
564.11 0004EE ZEROLESS: DW DOCODE
564.12 0004EE ENDIF
564.13 0004EE ENDM
565 0004EE 0757 ADD TOS,TOS ; set cy if TOS
negative
566 0004F0 0777 SUBC TOS,TOS ; TOS=-1 if carry
was clear
567 0004F2 37E3 XOR #-1,TOS ; TOS=-1 if carry
was set
568 0004F4 NEXT
568.1 0004F4 3645 MOV @IP+,W // ; fetch word address
into W
568.2 0004F6 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
568.3 0004F8 ENDM
569 0004F8
570 0004F8 ;C = x1 x2 -- flag test x1=x2
571 0004F8 HEADER EQUAL,1,'=',DOCODE
571.1 000000 PUBLIC EQUAL
571.2 0004F8 .... DW link
571.3 0004FA FF DB 0FFh ; not immediate
571.4 0004FB link SET $
571.5 0004FB 01 DB 1
571.6 0004FC 3D DB '='
571.7 0004FD 00 EVEN
571.8 0004FE IF 'DOCODE'='DOCODE'
571.9 0004FE .... EQUAL: DW $+2
571.10 000500 ELSE
571.11 000500 EQUAL: DW DOCODE
571.12 000500 ENDIF
571.13 000500 ENDM
572 000500 3644 MOV @PSP+,W
573 000502 0687 SUB TOS,W ; x1-x2 in W, flags
set
574 000504 1124 JZ TOSTRUE
575 000506 0743 TOSFALSE: MOV #0,TOS
576 000508 NEXT
576.1 000508 3645 MOV @IP+,W // ; fetch word address
into W
576.2 00050A 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
576.3 00050C ENDM
577 00050C
578 00050C ;X <> x1 x2 -- flag test not eq (not
ANSI)
579 00050C HEADER NOTEQUAL,2,'<>',DOCOLON
579.1 000000 PUBLIC NOTEQUAL
579.2 00050C .... DW link
579.3 00050E FF DB 0FFh ; not immediate
579.4 00050F link SET $
579.5 00050F 02 DB 2
579.6 000510 3C3E DB '<>'
579.7 000512 EVEN
579.8 000512 IF 'DOCOLON'='DOCODE'
579.9 000512 NOTEQUAL: DW $+2
579.10 000512 ELSE
579.11 000512 .... NOTEQUAL: DW DOCOLON
579.12 000514 ENDIF
579.13 000514 ENDM
580 000514 ............ DW EQUAL,ZEROEQUAL,EXIT
581 00051A
582 00051A ;C < n1 n2 -- flag test n1 n1 n2 -- flag test n1>n2,
signed
591 00052E HEADER GREATER,1,'>',DOCOLON
591.1 000000 PUBLIC GREATER
591.2 00052E .... DW link
591.3 000530 FF DB 0FFh ; not immediate
591.4 000531 link SET $
591.5 000531 01 DB 1
591.6 000532 3E DB '>'
591.7 000533 00 EVEN
591.8 000534 IF 'DOCOLON'='DOCODE'
591.9 000534 GREATER: DW $+2
591.10 000534 ELSE
591.11 000534 .... GREATER: DW DOCOLON
591.12 000536 ENDIF
591.13 000536 ENDM
592 000536 ............ DW SWAP,LESS,EXIT
593 00053C
594 00053C ;C U< u1 u2 -- flag test u1 u1 u2 -- flag u1>u2 unsgd (not
ANSI)
602 00054C HEADER UGREATER,2,'u>',DOCOLON
602.1 000000 PUBLIC UGREATER
602.2 00054C .... DW link
602.3 00054E FF DB 0FFh ; not immediate
602.4 00054F link SET $
602.5 00054F 02 DB 2
602.6 000550 753E DB 'u>'
602.7 000552 EVEN
602.8 000552 IF 'DOCOLON'='DOCODE'
602.9 000552 UGREATER: DW $+2
602.10 000552 ELSE
602.11 000552 .... UGREATER: DW DOCOLON
602.12 000554 ENDIF
602.13 000554 ENDM
603 000554 ............ DW SWAP,ULESS,EXIT
604 00055A
605 00055A ; ----------------------------------------------
------------------------
606 00055A ; LOOP AND BRANCH OPERATIONS
607 00055A ; These use relative branch addresses: a branch
is ADD @IP,IP
608 00055A
609 00055A ;Z branch -- branch
always
610 00055A HEADER bran,6,'branch',DOCODE
610.1 000000 PUBLIC bran
610.2 00055A .... DW link
610.3 00055C FF DB 0FFh ; not immediate
610.4 00055D link SET $
610.5 00055D 06 DB 6
610.6 00055E 6272616E6368 DB 'branch'
610.7 000564 EVEN
610.8 000564 IF 'DOCODE'='DOCODE'
610.9 000564 .... bran: DW $+2
610.10 000566 ELSE
610.11 000566 bran: DW DOCODE
610.12 000566 ENDIF
610.13 000566 ENDM
611 000566 2555 dobran: ADD @IP,IP ; 2
612 000568 NEXT ; 4
612.1 000568 3645 MOV @IP+,W // ; fetch word address
into W
612.2 00056A 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
612.3 00056C ENDM
613 00056C
614 00056C ;Z ?branch x -- branch if TOS
zero
615 00056C HEADER qbran,7,'?branch',DOCODE
615.1 000000 PUBLIC qbran
615.2 00056C .... DW link
615.3 00056E FF DB 0FFh ; not immediate
615.4 00056F link SET $
615.5 00056F 07 DB 7
615.6 000570 3F6272616E63* DB '?branch'
615.7 000577 00 EVEN
615.8 000578 IF 'DOCODE'='DOCODE'
615.9 000578 .... qbran: DW $+2
615.10 00057A ELSE
615.11 00057A qbran: DW DOCODE
615.12 00057A ENDIF
615.13 00057A ENDM
616 00057A 0753 ADD #0,TOS ; 1 test TOS value
617 00057C 3744 MOV @PSP+,TOS ; 2 pop new TOS value
(doesn't change
flags)
618 00057E F327 JZ dobran ; 2 if TOS was zero, take
the branch
619 000580 2553 ADD #2,IP ; 1 else skip the
branch destination
620 000582 NEXT ; 4
620.1 000582 3645 MOV @IP+,W // ; fetch word address
into W
620.2 000584 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
620.3 000586 ENDM
621 000586
622 000586 ;Z (do) n1|u1 n2|u2 -- R: -- sys1 sys2
623 000586 ;Z run-time code for
DO
624 000586 ; '83 and ANSI standard loops terminate when the
boundary of
625 000586 ; limit-1 and limit is crossed, in either
direction. This can
626 000586 ; be conveniently implemented by making the
limit 8000h, so that
627 000586 ; arithmetic overflow logic can detect crossing.
I learned this
628 000586 ; trick from Laxen & Perry F83.
629 000586 ; fudge factor = 8000h-limit, to be added to the
start value.
630 000586 HEADER xdo,4,'(do)',DOCODE
630.1 000000 PUBLIC xdo
630.2 000586 .... DW link
630.3 000588 FF DB 0FFh ; not immediate
630.4 000589 link SET $
630.5 000589 04 DB 4
630.6 00058A 28646F29 DB '(do)'
630.7 00058E EVEN
630.8 00058E IF 'DOCODE'='DOCODE'
630.9 00058E .... xdo: DW $+2
630.10 000590 ELSE
630.11 000590 xdo: DW DOCODE
630.12 000590 ENDIF
630.13 000590 ENDM
631 000590 2182 SUB #4,RSP ; push old loop
values on
return
stack
632 000592 81490200 MOV LIMIT,2(RSP)
633 000596 81480000 MOV INDEX,0(RSP)
634 00059A 39400080 MOV #8000h,LIMIT ; compute
8000h-limit
"fudge
factor"
635 00059E 3984 SUB @PSP+,LIMIT
636 0005A0 0847 MOV TOS,INDEX ; loop ctr =
index+fudge
637 0005A2 0859 ADD LIMIT,INDEX
638 0005A4 3744 MOV @PSP+,TOS ; pop new
TOS
639 0005A6 NEXT
639.1 0005A6 3645 MOV @IP+,W // ; fetch word address
into W
639.2 0005A8 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
639.3 0005AA ENDM
640 0005AA
641 0005AA ;Z (loop) R: sys1 sys2 -- | sys1 sys2
642 0005AA ;Z run-time code for
LOOP
643 0005AA ; Add 1 to the loop index. If loop terminates,
clean up the
644 0005AA ; return stack and skip the branch. Else take
the inline branch.
645 0005AA ; Note that LOOP terminates when index=8000h.
646 0005AA HEADER xloop,6,'(loop)',DOCODE
646.1 000000 PUBLIC xloop
646.2 0005AA .... DW link
646.3 0005AC FF DB 0FFh ; not immediate
646.4 0005AD link SET $
646.5 0005AD 06 DB 6
646.6 0005AE 286C6F6F7029 DB '(loop)'
646.7 0005B4 EVEN
646.8 0005B4 IF 'DOCODE'='DOCODE'
646.9 0005B4 .... xloop: DW $+2
646.10 0005B6 ELSE
646.11 0005B6 xloop: DW DOCODE
646.12 0005B6 ENDIF
646.13 0005B6 ENDM
647 0005B6 1853 ADD #1,INDEX
648 0005B8 32B00001 BIT #100h,SR ; is overflow bit
set?
649 0005BC D427 JZ dobran ; no overflow =
loop
650 0005BE 2553 ADD #2,IP ; overflow = loop
done, skip branch
ofs
651 0005C0 3841 MOV @RSP+,INDEX ; restore old loop
values
652 0005C2 3941 MOV @RSP+,LIMIT
653 0005C4 NEXT
653.1 0005C4 3645 MOV @IP+,W // ; fetch word address
into W
653.2 0005C6 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
653.3 0005C8 ENDM
654 0005C8
655 0005C8 ;Z (+loop) n -- R: sys1 sys2 -- | sys1
sys2
656 0005C8 ;Z run-time code for
+LOOP
657 0005C8 ; Add n to the loop index. If loop terminates,
clean up the
658 0005C8 ; return stack and skip the branch. Else take
the inline branch.
659 0005C8 HEADER xplusloop,7,'(+loop)',DOCODE
659.1 000000 PUBLIC xplusloop
659.2 0005C8 .... DW link
659.3 0005CA FF DB 0FFh ; not immediate
659.4 0005CB link SET $
659.5 0005CB 07 DB 7
659.6 0005CC 282B6C6F6F70* DB '(+loop)'
659.7 0005D3 00 EVEN
659.8 0005D4 IF 'DOCODE'='DOCODE'
659.9 0005D4 .... xplusloop: DW $+2
659.10 0005D6 ELSE
659.11 0005D6 xplusloop: DW DOCODE
659.12 0005D6 ENDIF
659.13 0005D6 ENDM
660 0005D6 0857 ADD TOS,INDEX
661 0005D8 3744 MOV @PSP+,TOS ; get new TOS,
doesn't change
flags
662 0005DA 32B00001 BIT #100h,SR ; is overflow bit
set?
663 0005DE C327 JZ dobran ; no overflow =
loop
664 0005E0 2553 ADD #2,IP ; overflow = loop
done, skip branch
ofs
665 0005E2 3841 MOV @RSP+,INDEX ; restore old loop
values
666 0005E4 3941 MOV @RSP+,LIMIT
667 0005E6 NEXT
667.1 0005E6 3645 MOV @IP+,W // ; fetch word address
into W
667.2 0005E8 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
667.3 0005EA ENDM
668 0005EA
669 0005EA ;C I -- n R: sys1 sys2 -- sys1
sys2
670 0005EA ;C get the innermost loop
index
671 0005EA HEADER II,1,'i',DOCODE
671.1 000000 PUBLIC II
671.2 0005EA .... DW link
671.3 0005EC FF DB 0FFh ; not immediate
671.4 0005ED link SET $
671.5 0005ED 01 DB 1
671.6 0005EE 69 DB 'i'
671.7 0005EF 00 EVEN
671.8 0005F0 IF 'DOCODE'='DOCODE'
671.9 0005F0 .... II: DW $+2
671.10 0005F2 ELSE
671.11 0005F2 II: DW DOCODE
671.12 0005F2 ENDIF
671.13 0005F2 ENDM
672 0005F2 2483 SUB #2,PSP ; make room in
TOS
673 0005F4 84470000 MOV TOS,0(PSP)
674 0005F8 0748 MOV INDEX,TOS ; index =
loopctr -
fudge
675 0005FA 0789 SUB LIMIT,TOS
676 0005FC NEXT
676.1 0005FC 3645 MOV @IP+,W // ; fetch word address
into W
676.2 0005FE 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
676.3 000600 ENDM
677 000600
678 000600 ;C J -- n R: 4*sys -- 4*sys
679 000600 ;C get the second loop
index
680 000600 HEADER JJ,1,'j',DOCODE
680.1 000000 PUBLIC JJ
680.2 000600 .... DW link
680.3 000602 FF DB 0FFh ; not immediate
680.4 000603 link SET $
680.5 000603 01 DB 1
680.6 000604 6A DB 'j'
680.7 000605 00 EVEN
680.8 000606 IF 'DOCODE'='DOCODE'
680.9 000606 .... JJ: DW $+2
680.10 000608 ELSE
680.11 000608 JJ: DW DOCODE
680.12 000608 ENDIF
680.13 000608 ENDM
681 000608 2483 SUB #2,PSP ; make room in
TOS
682 00060A 84470000 MOV TOS,0(PSP)
683 00060E 2741 MOV @RSP,TOS ; index =
loopctr -
fudge
684 000610 17810200 SUB 2(RSP),TOS
685 000614 NEXT
685.1 000614 3645 MOV @IP+,W // ; fetch word address
into W
685.2 000616 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
685.3 000618 ENDM
686 000618
687 000618 ;C UNLOOP -- R: sys1 sys2 -- drop loop
parms
688 000618 HEADER UNLOOP,6,'unloop',DOCODE
688.1 000000 PUBLIC UNLOOP
688.2 000618 .... DW link
688.3 00061A FF DB 0FFh ; not immediate
688.4 00061B link SET $
688.5 00061B 06 DB 6
688.6 00061C 756E6C6F6F70 DB 'unloop'
688.7 000622 EVEN
688.8 000622 IF 'DOCODE'='DOCODE'
688.9 000622 .... UNLOOP: DW $+2
688.10 000624 ELSE
688.11 000624 UNLOOP: DW DOCODE
688.12 000624 ENDIF
688.13 000624 ENDM
689 000624 3841 MOV @RSP+,INDEX ; restore old
loop values
690 000626 3941 MOV @RSP+,LIMIT
691 000628 NEXT
691.1 000628 3645 MOV @IP+,W // ; fetch word address
into W
691.2 00062A 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
691.3 00062C ENDM
692 00062C
693 00062C ; ----------------------------------------------
------------------------
694 00062C ; MULTIPLY AND DIVIDE
695 00062C
696 00062C ;C UM* u1 u2 -- ud unsigned 16x16->32
mult.
697 00062C HEADER UMSTAR,3,'um*',DOCODE
697.1 000000 PUBLIC UMSTAR
697.2 00062C .... DW link
697.3 00062E FF DB 0FFh ; not immediate
697.4 00062F link SET $
697.5 00062F 03 DB 3
697.6 000630 756D2A DB 'um*'
697.7 000633 00 EVEN
697.8 000634 IF 'DOCODE'='DOCODE'
697.9 000634 .... UMSTAR: DW $+2
697.10 000636 ELSE
697.11 000636 UMSTAR: DW DOCODE
697.12 000636 ENDIF
697.13 000636 ENDM
698 000636 ; IROP1 = TOS register
699 000636 2A44 MOV @PSP,IROP2L ; get u1, leave
room on
stack
700 000638 ;
701 000638 ; T.I. SIGNED MULTIPLY SUBROUTINE: IROP1 x
IROP2L -> IRACM|IRACL
702 000638 0C43 MPYU: CLR IRACL ; 0 -> LSBs RESULT
703 00063A 0D43 CLR IRACM ; 0 -> MSBs RESULT
704 00063C ; UNSIGNED MULTIPLY AND ACCUMULATE SUBROUTINE:
705 00063C ; (IROP1 x IROP2L) + IRACM|IRACL -> IRACM|IRACL
706 00063C 0B43 MACU: CLR IROP2M ; MSBs MULTIPLIER
707 00063E 1643 MOV #1,IRBT ; BIT TEST REGISTER
708 000640 07B6 L$002: BIT IRBT,IROP1 ; TEST ACTUAL BIT
709 000642 0224 JZ L$01 ; IF 0: DO NOTHING
710 000644 0C5A ADD IROP2L,IRACL ; IF 1: ADD MULTIPLIER
TO RESULT
711 000646 0D6B ADDC IROP2M,IRACM
712 000648 0A5A L$01: RLA IROP2L ; MULTIPLIER x 2
713 00064A 0B6B RLC IROP2M
714 00064C ;
715 00064C 0656 RLA IRBT ; NEXT BIT TO TEST
716 00064E F82B JNC L$002 ; IF BIT IN CARRY:
FINISHED
717 000650 ; END T.I. ROUTINE section 5.1.1 of MSP430
Family Application Reports
718 000650 844C0000 MOV IRACL,0(PSP) ; low result on
stack
719 000654 074D MOV IRACM,TOS ; high result in
TOS
720 000656 NEXT
720.1 000656 3645 MOV @IP+,W // ; fetch word address
into W
720.2 000658 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
720.3 00065A ENDM
721 00065A
722 00065A ;C UM/MOD ud u1 -- u2 u3 unsigned 32/16->16
723 00065A HEADER UMSLASHMOD,6,'um/mod',DOCODE
723.1 000000 PUBLIC UMSLASHMOD
723.2 00065A .... DW link
723.3 00065C FF DB 0FFh ; not immediate
723.4 00065D link SET $
723.5 00065D 06 DB 6
723.6 00065E 756D2F6D6F64 DB 'um/mod'
723.7 000664 EVEN
723.8 000664 IF 'DOCODE'='DOCODE'
723.9 000664 .... UMSLASHMOD: DW $+2
723.10 000666 ELSE
723.11 000666 UMSLASHMOD: DW DOCODE
723.12 000666 ENDIF
723.13 000666 ENDM
724 000666 ; IROP1 = TOS register
725 000666 3B44 MOV @PSP+,IROP2M ; get ud
hi
726 000668 2A44 MOV @PSP,IROP2L ; get ud lo,
leave room on
stack
727 00066A ;
728 00066A ; T.I. UNSIGNED DIVISION SUBROUTINE 32-BIT BY
16-BIT
729 00066A ; IROP2M|IROP2L : IROP1 -> IRACL REMAINDER IN
IROP2M
730 00066A ; RETURN: CARRY = 0: OK CARRY = 1: QUOTIENT > 16
BITS
731 00066A 0C43 DIVIDE: CLR IRACL ; CLEAR RESULT
732 00066C 36401100 MOV #17,IRBT ; INITIALIZE LOOP
COUNTER
733 000670 0B97 DIV1: CMP IROP1,IROP2M ;
734 000672 0128 JLO DIV2
735 000674 0B87 SUB IROP1,IROP2M
736 000676 0C6C DIV2: RLC IRACL
737 000678 092C JC DIV4 ; Error: result > 16
bits
738 00067A 1683 DEC IRBT ; Decrement loop counter
739 00067C 0624 JZ DIV3 ; Is 0: terminate w/o
error
740 00067E 0A5A RLA IROP2L
741 000680 0B6B RLC IROP2M
742 000682 F62B JNC DIV1
743 000684 0B87 SUB IROP1,IROP2M
744 000686 12D3 SETC
745 000688 F63F JMP DIV2
746 00068A 12C3 DIV3: CLRC ; No error, C = 0
747 00068C DIV4: ; Error indication in C
748 00068C ; END T.I. ROUTINE Section 5.1.5 of MSP430
Family Application Reports
749 00068C 844B0000 MOV IROP2M,0(PSP) ; remainder on
stack
750 000690 074C MOV IRACL,TOS ; quotient in
TOS
751 000692 NEXT
751.1 000692 3645 MOV @IP+,W // ; fetch word address
into W
751.2 000694 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
751.3 000696 ENDM
752 000696
753 000696 ; ----------------------------------------------
------------------------
754 000696 ; BLOCK AND STRING OPERATIONS
755 000696
756 000696 ;C FILL c-addr u char -- fill memory with
char
757 000696 HEADER FILL,4,'fill',DOCODE
757.1 000000 PUBLIC FILL
757.2 000696 .... DW link
757.3 000698 FF DB 0FFh ; not immediate
757.4 000699 link SET $
757.5 000699 04 DB 4
757.6 00069A 66696C6C DB 'fill'
757.7 00069E EVEN
757.8 00069E IF 'DOCODE'='DOCODE'
757.9 00069E .... FILL: DW $+2
757.10 0006A0 ELSE
757.11 0006A0 FILL: DW DOCODE
757.12 0006A0 ENDIF
757.13 0006A0 ENDM
758 0006A0 3A44 MOV @PSP+,X ; count
759 0006A2 3644 MOV @PSP+,W ; address
760 0006A4 0A93 CMP #0,X
761 0006A6 0524 JZ FILL_X
762 0006A8 C6470000 FILL_1: MOV.B TOS,0(W) ; store char in
memory
763 0006AC 1653 ADD #1,W
764 0006AE 1A83 SUB #1,X
765 0006B0 FB23 JNZ FILL_1
766 0006B2 3744 FILL_X: MOV @PSP+,TOS ; pop new TOS
767 0006B4 NEXT
767.1 0006B4 3645 MOV @IP+,W // ; fetch word address
into W
767.2 0006B6 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
767.3 0006B8 ENDM
768 0006B8
769 0006B8 ;X CMOVE c-addr1 c-addr2 u -- move from
bottom
770 0006B8 ; as defined in the ANSI optional String word
set
771 0006B8 ; On byte machines, CMOVE and CMOVE> are
logical
772 0006B8 ; factors of MOVE. They are easy to implement
on
773 0006B8 ; CPUs which have a block-move instruction.
774 0006B8 HEADER CMOVE,5,'cmove',DOCODE
774.1 000000 PUBLIC CMOVE
774.2 0006B8 .... DW link
774.3 0006BA FF DB 0FFh ; not immediate
774.4 0006BB link SET $
774.5 0006BB 05 DB 5
774.6 0006BC 636D6F7665 DB 'cmove'
774.7 0006C1 00 EVEN
774.8 0006C2 IF 'DOCODE'='DOCODE'
774.9 0006C2 .... CMOVE: DW $+2
774.10 0006C4 ELSE
774.11 0006C4 CMOVE: DW DOCODE
774.12 0006C4 ENDIF
774.13 0006C4 ENDM
775 0006C4 3644 MOV @PSP+,W ; dest adrs
776 0006C6 3A44 MOV @PSP+,X ; src adrs
777 0006C8 0793 CMP #0,TOS
778 0006CA 0524 JZ CMOVE_X
779 0006CC F64A0000 CMOVE_1: MOV.B @X+,0(W) ; copy byte
780 0006D0 1653 ADD #1,W
781 0006D2 1783 SUB #1,TOS
782 0006D4 FB23 JNZ CMOVE_1
783 0006D6 3744 CMOVE_X: MOV @PSP+,TOS ; pop new TOS
784 0006D8 NEXT
784.1 0006D8 3645 MOV @IP+,W // ; fetch word address
into W
784.2 0006DA 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
784.3 0006DC ENDM
785 0006DC
786 0006DC ;X CMOVE> c-addr1 c-addr2 u -- move from
top
787 0006DC ; as defined in the ANSI optional String word
set
788 0006DC HEADER CMOVEUP,6,'cmove>',DOCODE
788.1 000000 PUBLIC CMOVEUP
788.2 0006DC .... DW link
788.3 0006DE FF DB 0FFh ; not immediate
788.4 0006DF link SET $
788.5 0006DF 06 DB 6
788.6 0006E0 636D6F76653E DB 'cmove>'
788.7 0006E6 EVEN
788.8 0006E6 IF 'DOCODE'='DOCODE'
788.9 0006E6 .... CMOVEUP: DW $+2
788.10 0006E8 ELSE
788.11 0006E8 CMOVEUP: DW DOCODE
788.12 0006E8 ENDIF
788.13 0006E8 ENDM
789 0006E8 3644 MOV @PSP+,W ; dest adrs
790 0006EA 3A44 MOV @PSP+,X ; src adrs
791 0006EC 0793 CMP #0,TOS
792 0006EE 0824 JZ CMOVU_X
793 0006F0 0657 ADD TOS,W ; start at
end
794 0006F2 0A57 ADD TOS,X
795 0006F4 1A83 CMOVU_1: SUB #1,X
796 0006F6 1683 SUB #1,W
797 0006F8 E64A0000 MOV.B @X,0(W) ; copy byte
798 0006FC 1783 SUB #1,TOS
799 0006FE FA23 JNZ CMOVU_1
800 000700 3744 CMOVU_X: MOV @PSP+,TOS ; pop new TOS
801 000702 NEXT
801.1 000702 3645 MOV @IP+,W // ; fetch word address
into W
801.2 000704 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
801.3 000706 ENDM
802 000706
803 000706 ;Z I->D c-addr1 c-addr2 u -- move
Code->Data
804 000706 ; Block move from Code space to Data space.
805 000706 ; On the MSP430, this is the same as CMOVE.
806 000706 HEADER ITOD,4,'i->d',CMOVE+2
806.1 000000 PUBLIC ITOD
806.2 000706 .... DW link
806.3 000708 FF DB 0FFh ; not immediate
806.4 000709 link SET $
806.5 000709 04 DB 4
806.6 00070A 692D3E64 DB 'i->d'
806.7 00070E EVEN
806.8 00070E IF 'CMOVE+2'='DOCODE'
806.9 00070E ITOD: DW $+2
806.10 00070E ELSE
806.11 00070E .... ITOD: DW CMOVE+2
806.12 000710 ENDIF
806.13 000710 ENDM
807 000710
808 000710 ;Z SKIP c-addr u c -- c-addr' u'
809 000710 ;Z skip matching
chars
810 000710 ; Although SKIP, SCAN, and S= are perhaps not
the ideal factors
811 000710 ; of WORD and FIND, they closely follow the
string operations
812 000710 ; available on many CPUs, and so are easy to
implement and fast.
813 000710 HEADER SKIP,4,'skip',DOCODE
813.1 000000 PUBLIC SKIP
813.2 000710 .... DW link
813.3 000712 FF DB 0FFh ; not immediate
813.4 000713 link SET $
813.5 000713 04 DB 4
813.6 000714 736B6970 DB 'skip'
813.7 000718 EVEN
813.8 000718 IF 'DOCODE'='DOCODE'
813.9 000718 .... SKIP: DW $+2
813.10 00071A ELSE
813.11 00071A SKIP: DW DOCODE
813.12 00071A ENDIF
813.13 00071A ENDM
814 00071A 3A44 MOV @PSP+,X ; get count
815 00071C 2644 MOV @PSP,W ; get address, leave
space on stack
816 00071E 0A93 CMP #0,X
817 000720 0524 JZ SKIP_X
818 000722 6796 SKIP_1: CMP.B @W,TOS ; does character
match?
819 000724 0320 JNZ SKIP_X ; no, we are
done
820 000726 1653 ADD #1,W
821 000728 1A83 SUB #1,X
822 00072A FB23 JNZ SKIP_1
823 00072C 84460000 SKIP_X: MOV W,0(PSP) ; store updated
address on
stack
824 000730 074A MOV X,TOS ; updated count to
TOS
825 000732 NEXT
825.1 000732 3645 MOV @IP+,W // ; fetch word address
into W
825.2 000734 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
825.3 000736 ENDM
826 000736
827 000736 ;Z SCAN c-addr u c -- c-addr' u'
828 000736 ;Z find matching char
829 000736 HEADER SCAN,4,'scan',DOCODE
829.1 000000 PUBLIC SCAN
829.2 000736 .... DW link
829.3 000738 FF DB 0FFh ; not immediate
829.4 000739 link SET $
829.5 000739 04 DB 4
829.6 00073A 7363616E DB 'scan'
829.7 00073E EVEN
829.8 00073E IF 'DOCODE'='DOCODE'
829.9 00073E .... SCAN: DW $+2
829.10 000740 ELSE
829.11 000740 SCAN: DW DOCODE
829.12 000740 ENDIF
829.13 000740 ENDM
830 000740 3A44 MOV @PSP+,X ; get count
831 000742 2644 MOV @PSP,W ; get address, leave
space on stack
832 000744 0A93 CMP #0,X
833 000746 0524 JZ SCAN_X
834 000748 6796 SCAN_1: CMP.B @W,TOS ; does character
match?
835 00074A 0324 JZ SCAN_X ; yes, we are
done
836 00074C 1653 ADD #1,W
837 00074E 1A83 SUB #1,X
838 000750 FB23 JNZ SCAN_1
839 000752 84460000 SCAN_X: MOV W,0(PSP) ; store updated
address on
stack
840 000756 074A MOV X,TOS ; updated count to
TOS
841 000758 NEXT
841.1 000758 3645 MOV @IP+,W // ; fetch word address
into W
841.2 00075A 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
841.3 00075C ENDM
842 00075C
843 00075C ;Z S= c-addr1 c-addr2 u -- n string
compare
844 00075C ;Z n<0: s10:
s1>s2
845 00075C HEADER SEQUAL,2,'s=',DOCODE
845.1 000000 PUBLIC SEQUAL
845.2 00075C .... DW link
845.3 00075E FF DB 0FFh ; not immediate
845.4 00075F link SET $
845.5 00075F 02 DB 2
845.6 000760 733D DB 's='
845.7 000762 EVEN
845.8 000762 IF 'DOCODE'='DOCODE'
845.9 000762 .... SEQUAL: DW $+2
845.10 000764 ELSE
845.11 000764 SEQUAL: DW DOCODE
845.12 000764 ENDIF
845.13 000764 ENDM
846 000764 3644 MOV @PSP+,W ; adrs2
847 000766 3A44 MOV @PSP+,X ; adrs1
848 000768 0793 CMP #0,TOS
849 00076A 0A24 JZ SEQU_X
850 00076C FA960000 SEQU_1: CMP.B @W+,0(X) ; compare char1-char
2
851 000770 0420 JNZ SMISMATCH
852 000772 1A53 ADD #1,X
853 000774 1783 SUB #1,TOS
854 000776 FA23 JNZ SEQU_1
855 000778 ; no mismatch found, strings are equal,
TOS=0
856 000778 033C JMP SEQU_X
857 00077A ; mismatch found, CY clear if borrow set
(s10:
s1>s2
865 000784 ; For Harvard model, c-addr1 is Data, c-addr2 is
Header.
866 000784 ; On MSP430, both use the same fetch instruction
, so N= is the same as S=.
867 000784 HEADER NEQUAL,2,'n=',SEQUAL+2
867.1 000000 PUBLIC NEQUAL
867.2 000784 .... DW link
867.3 000786 FF DB 0FFh ; not immediate
867.4 000787 link SET $
867.5 000787 02 DB 2
867.6 000788 6E3D DB 'n='
867.7 00078A EVEN
867.8 00078A IF 'SEQUAL+2'='DOCODE'
867.9 00078A NEQUAL: DW $+2
867.10 00078A ELSE
867.11 00078A .... NEQUAL: DW SEQUAL+2
867.12 00078C ENDIF
867.13 00078C ENDM
868 00078C
869 00078C ; ----------------------------------------------
------------------------
870 00078C ; TERMINAL I/O
871 00078C
872 00078C ;C EMIT c -- output character to
console
873 00078C HEADER EMIT,4,'emit',DOCODE
873.1 000000 PUBLIC EMIT
873.2 00078C .... DW link
873.3 00078E FF DB 0FFh ; not immediate
873.4 00078F link SET $
873.5 00078F 04 DB 4
873.6 000790 656D6974 DB 'emit'
873.7 000794 EVEN
873.8 000794 IF 'DOCODE'='DOCODE'
873.9 000794 .... EMIT: DW $+2
873.10 000796 ELSE
873.11 000796 EMIT: DW DOCODE
873.12 000796 ENDIF
873.13 000796 ENDM
874 000796 EMITLOOP:
875 000796 E2B30300 BIT.B #UCA0TXIFG,&IFG2
876 00079A FD27 JZ EMITLOOP
877 00079C C2476700 MOV.B TOS,&UCA0TXBUF
878 0007A0 3744 MOV @PSP+,TOS
879 0007A2 NEXT
879.1 0007A2 3645 MOV @IP+,W // ; fetch word address
into W
879.2 0007A4 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
879.3 0007A6 ENDM
880 0007A6
881 0007A6
882 0007A6 /*
883 0007A6 ;C EMIT c -- output character to
console
884 0007A6 HEADER EMIT,4,'emit',DOCOLON
885 0007A6 DW EMITVEC,FETCH,EXECUTE,EXIT
886 0007A6
887 0007A6 PUBLIC OEMIT
888 0007A6 ;C OEMIT c -- output character to
console
889 0007A6 HEADER OEMIT,5,'oemit',DOCODE
890 0007A6 EMITLOOP:
891 0007A6 BIT.B #UCA0TXIFG,&IFG2
892 0007A6 JZ EMITLOOP
893 0007A6 MOV.B TOS,&UCA0TXBUF
894 0007A6 MOV @PSP+,TOS
895 0007A6 NEXT
896 0007A6 */
897 0007A6 ;C KEY -- c get character from
keyboard
898 0007A6 HEADER KEY,3,'key',DOCODE
898.1 000000 PUBLIC KEY
898.2 0007A6 .... DW link
898.3 0007A8 FF DB 0FFh ; not immediate
898.4 0007A9 link SET $
898.5 0007A9 03 DB 3
898.6 0007AA 6B6579 DB 'key'
898.7 0007AD 00 EVEN
898.8 0007AE IF 'DOCODE'='DOCODE'
898.9 0007AE .... KEY: DW $+2
898.10 0007B0 ELSE
898.11 0007B0 KEY: DW DOCODE
898.12 0007B0 ENDIF
898.13 0007B0 ENDM
899 0007B0 KEYLOOP:
900 0007B0 D2B30300 BIT.B #UCA0RXIFG,&IFG2
901 0007B4 FD27 JZ KEYLOOP
902 0007B6 2483 SUB #2,PSP ; 1 push old
TOS..
903 0007B8 84470000 MOV TOS,0(PSP) ; 4 ..onto
stack
904 0007BC 57426600 MOV.B &UCA0RXBUF,TOS ; read
character
into
TOS
905 0007C0 donoop:
906 0007C0 donext: NEXT
906.1 0007C0 3645 MOV @IP+,W // ; fetch word address
into W
906.2 0007C2 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
906.3 0007C4 ENDM
907 0007C4
908 0007C4 ;X KEY? -- f return true if char
waiting
909 0007C4 HEADER KEYQ,4,'key?',DOCODE
909.1 000000 PUBLIC KEYQ
909.2 0007C4 .... DW link
909.3 0007C6 FF DB 0FFh ; not immediate
909.4 0007C7 link SET $
909.5 0007C7 04 DB 4
909.6 0007C8 6B65793F DB 'key?'
909.7 0007CC EVEN
909.8 0007CC IF 'DOCODE'='DOCODE'
909.9 0007CC .... KEYQ: DW $+2
909.10 0007CE ELSE
909.11 0007CE KEYQ: DW DOCODE
909.12 0007CE ENDIF
909.13 0007CE ENDM
910 0007CE 2483 SUB #2,PSP ; 1 push old
TOS..
911 0007D0 84470000 MOV TOS,0(PSP) ; 4 ..onto
stack
912 0007D4 D2B30300 BIT.B #UCA0RXIFG,&IFG2
913 0007D8 A722 JNZ TOSTRUE
914 0007DA 953E JMP TOSFALSE
915 0007DC
916 0007DC ; ----------------------------------------------
------------------------
917 0007DC ; We #include the following source files, rather
than compiling them
918 0007DC ; separately, so that they can inherit the value
of 'link'.
919 0007DC
920 0007DC #include "se-deps430G2553.s43"
1 0007DC ; ----------------------------------------------
------------------------
2 0007DC ; CamelForth for the Texas Instruments MSP430
3 0007DC ; (c) 2009 Bradford J. Rodriguez.
4 0007DC ;
5 0007DC ; This program is free software; you can
redistribute it and/or modify
6 0007DC ; it under the terms of the GNU General Public
License as published by
7 0007DC ; the Free Software Foundation; either version 3
of the License, or
8 0007DC ; (at your option) any later version.
9 0007DC ;
10 0007DC ; This program is distributed in the hope that
it will be useful,
11 0007DC ; but WITHOUT ANY WARRANTY; without even the
implied warranty of
12 0007DC ; MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the
13 0007DC ; GNU General Public License for more details.
14 0007DC ;
15 0007DC ; You should have received a copy of the GNU
General Public License
16 0007DC ; along with this program. If not, see
.
17 0007DC ;
18 0007DC ; Commercial inquiries should be directed to the
author at
19 0007DC ; 115 First St., #105, Collingwood, Ontario L9Y
4W3 Canada
20 0007DC ; or via email to bj@camelforth.com
21 0007DC ; ----------------------------------------------
------------------------
22 0007DC ; deps430.s43: CPU and Model Dependencies -
MSP430F1611
23 0007DC ; B. Rodriguez 4 Jan 09
24 0007DC
25 0007DC ; Forth words are documented as follows:
26 0007DC ;x NAME stack -- stack description
27 0007DC ; where x=C for ANS Forth Core words, X for
ANS
28 0007DC ; Extensions, Z for internal or private
words.
29 0007DC ;
30 0007DC ; Indirect-Threaded Forth model for T.I.
MSP430
31 0007DC ; cell size is 16 bits (2 bytes)
32 0007DC ; char size is 8 bits (1 byte)
33 0007DC ; address unit is 8 bits (1 byte), i.e.,
addresses are byte-aligned.
34 0007DC ; ----------------------------------------------
------------------------
35 0007DC
36 0007DC ; ----------------------------------------------
------------------------
37 0007DC ; ALIGNMENT AND PORTABILITY OPERATORS
38 0007DC ; Many of these are synonyms for other
words,
39 0007DC ; and so are defined as CODE words.
40 0007DC
41 0007DC ;C ALIGN -- align
HERE
42 0007DC ; IHERE 1 AND IALLOT ;
43 0007DC HEADER ALIGNN,5,'align',DOCOLON
43.1 000000 PUBLIC ALIGNN
43.2 0007DC .... DW link
43.3 0007DE FF DB 0FFh ; not immediate
43.4 0007DF link SET $
43.5 0007DF 05 DB 5
43.6 0007E0 616C69676E DB 'align'
43.7 0007E5 00 EVEN
43.8 0007E6 IF 'DOCOLON'='DOCODE'
43.9 0007E6 ALIGNN: DW $+2
43.10 0007E6 ELSE
43.11 0007E6 .... ALIGNN: DW DOCOLON
43.12 0007E8 ENDIF
43.13 0007E8 ENDM
44 0007E8 ........0100* DW IHERE,lit,1,ANDD,IALLOT,EXIT
45 0007F4
46 0007F4 ;C ALIGNED addr -- a-addr align given
addr
47 0007F4 ; DUP 1 AND + ;
48 0007F4 HEADER ALIGNED,7,'aligned',DOCOLON
48.1 000000 PUBLIC ALIGNED
48.2 0007F4 .... DW link
48.3 0007F6 FF DB 0FFh ; not immediate
48.4 0007F7 link SET $
48.5 0007F7 07 DB 7
48.6 0007F8 616C69676E65* DB 'aligned'
48.7 0007FF 00 EVEN
48.8 000800 IF 'DOCOLON'='DOCODE'
48.9 000800 ALIGNED: DW $+2
48.10 000800 ELSE
48.11 000800 .... ALIGNED: DW DOCOLON
48.12 000802 ENDIF
48.13 000802 ENDM
49 000802 ........0100* DW DUP,lit,1,ANDD,PLUS,EXIT
50 00080E
51 00080E ;Z CELL -- n size of one
cell
52 00080E HEADER CELL,4,'cell',DOCON
52.1 000000 PUBLIC CELL
52.2 00080E .... DW link
52.3 000810 FF DB 0FFh ; not immediate
52.4 000811 link SET $
52.5 000811 04 DB 4
52.6 000812 63656C6C DB 'cell'
52.7 000816 EVEN
52.8 000816 IF 'DOCON'='DOCODE'
52.9 000816 CELL: DW $+2
52.10 000816 ELSE
52.11 000816 .... CELL: DW DOCON
52.12 000818 ENDIF
52.13 000818 ENDM
53 000818 0200 dw 2
54 00081A
55 00081A ;C CELL+ a-addr1 -- a-addr2 add cell
size
56 00081A ; 2 + ;
57 00081A HEADER CELLPLUS,5,'cell+',DOCODE
57.1 000000 PUBLIC CELLPLUS
57.2 00081A .... DW link
57.3 00081C FF DB 0FFh ; not immediate
57.4 00081D link SET $
57.5 00081D 05 DB 5
57.6 00081E 63656C6C2B DB 'cell+'
57.7 000823 00 EVEN
57.8 000824 IF 'DOCODE'='DOCODE'
57.9 000824 .... CELLPLUS: DW $+2
57.10 000826 ELSE
57.11 000826 CELLPLUS: DW DOCODE
57.12 000826 ENDIF
57.13 000826 ENDM
58 000826 2753 ADD #2,TOS
59 000828 CB3F JMP donext
60 00082A
61 00082A ;C CELLS n1 -- n2 cells->adrs
units
62 00082A HEADER CELLS,5,'cells',TWOSTAR+2
62.1 000000 PUBLIC CELLS
62.2 00082A .... DW link
62.3 00082C FF DB 0FFh ; not immediate
62.4 00082D link SET $
62.5 00082D 05 DB 5
62.6 00082E 63656C6C73 DB 'cells'
62.7 000833 00 EVEN
62.8 000834 IF 'TWOSTAR+2'='DOCODE'
62.9 000834 CELLS: DW $+2
62.10 000834 ELSE
62.11 000834 .... CELLS: DW TWOSTAR+2
62.12 000836 ENDIF
62.13 000836 ENDM
63 000836
64 000836 ;C CHAR+ c-addr1 -- c-addr2 add char
size
65 000836 HEADER CHARPLUS,5,'char+',ONEPLUS+2
65.1 000000 PUBLIC CHARPLUS
65.2 000836 .... DW link
65.3 000838 FF DB 0FFh ; not immediate
65.4 000839 link SET $
65.5 000839 05 DB 5
65.6 00083A 636861722B DB 'char+'
65.7 00083F 00 EVEN
65.8 000840 IF 'ONEPLUS+2'='DOCODE'
65.9 000840 CHARPLUS: DW $+2
65.10 000840 ELSE
65.11 000840 .... CHARPLUS: DW ONEPLUS+2
65.12 000842 ENDIF
65.13 000842 ENDM
66 000842
67 000842 ;C CHARS n1 -- n2 chars->adrs
units
68 000842 HEADER CHARS,5,'chars',donoop
68.1 000000 PUBLIC CHARS
68.2 000842 .... DW link
68.3 000844 FF DB 0FFh ; not immediate
68.4 000845 link SET $
68.5 000845 05 DB 5
68.6 000846 6368617273 DB 'chars'
68.7 00084B 00 EVEN
68.8 00084C IF 'donoop'='DOCODE'
68.9 00084C CHARS: DW $+2
68.10 00084C ELSE
68.11 00084C .... CHARS: DW donoop
68.12 00084E ENDIF
68.13 00084E ENDM
69 00084E
70 00084E ;C >BODY xt -- a-addr adrs of CREATE
data
71 00084E ; 2+ ; 8086 (3 byte
CALL)
72 00084E HEADER TOBODY,5,'>body',CELLPLUS+2
72.1 000000 PUBLIC TOBODY
72.2 00084E .... DW link
72.3 000850 FF DB 0FFh ; not immediate
72.4 000851 link SET $
72.5 000851 05 DB 5
72.6 000852 3E626F6479 DB '>body'
72.7 000857 00 EVEN
72.8 000858 IF 'CELLPLUS+2'='DOCODE'
72.9 000858 TOBODY: DW $+2
72.10 000858 ELSE
72.11 000858 .... TOBODY: DW CELLPLUS+2
72.12 00085A ENDIF
72.13 00085A ENDM
73 00085A
74 00085A ;X COMPILE, xt -- append execution
token
75 00085A ; I called this word ,XT before I discovered
that it is defined in the
76 00085A ; ANSI standard as COMPILE,. On a DTC Forth this
simply appends xt
77 00085A ; (like , ) but on an STC Forth this must append
'CALL xt'.
78 00085A HEADER COMMAXT,8,'compile,',DOALIAS
78.1 000000 PUBLIC COMMAXT
78.2 00085A .... DW link
78.3 00085C FF DB 0FFh ; not immediate
78.4 00085D link SET $
78.5 00085D 08 DB 8
78.6 00085E 636F6D70696C* DB 'compile,'
78.7 000866 EVEN
78.8 000866 IF 'DOALIAS'='DOCODE'
78.9 000866 COMMAXT: DW $+2
78.10 000866 ELSE
78.11 000866 .... COMMAXT: DW DOALIAS
78.12 000868 ENDIF
78.13 000868 ENDM
79 000868 .... DW ICOMMA
80 00086A
81 00086A ;Z !CF adrs cfa -- set code action of a
word
82 00086A ; I! ;
83 00086A ; Indirect threaded model just stores adrs in
cfa field.
84 00086A HEADER STORECF,3,'!cf',DOALIAS
84.1 000000 PUBLIC STORECF
84.2 00086A .... DW link
84.3 00086C FF DB 0FFh ; not immediate
84.4 00086D link SET $
84.5 00086D 03 DB 3
84.6 00086E 216366 DB '!cf'
84.7 000871 00 EVEN
84.8 000872 IF 'DOALIAS'='DOCODE'
84.9 000872 STORECF: DW $+2
84.10 000872 ELSE
84.11 000872 .... STORECF: DW DOALIAS
84.12 000874 ENDIF
84.13 000874 ENDM
85 000874 .... DW ISTORE
86 000876
87 000876 ;Z ,CF adrs -- append a code field
88 000876 ; IHERE !CF 2 IALLOT ; MSP430 VERSION (2
bytes)
89 000876 HEADER COMMACF,3,',cf',DOCOLON
89.1 000000 PUBLIC COMMACF
89.2 000876 .... DW link
89.3 000878 FF DB 0FFh ; not immediate
89.4 000879 link SET $
89.5 000879 03 DB 3
89.6 00087A 2C6366 DB ',cf'
89.7 00087D 00 EVEN
89.8 00087E IF 'DOCOLON'='DOCODE'
89.9 00087E COMMACF: DW $+2
89.10 00087E ELSE
89.11 00087E .... COMMACF: DW DOCOLON
89.12 000880 ENDIF
89.13 000880 ENDM
90 000880 ............* DW IHERE,STORECF,lit,2,IALLOT,EXIT
91 00088C
92 00088C ;Z ,CALL adrs -- append a subroutine
CALL
93 00088C ; MSP430: 128x is call, Ad=11, Dreg=0000 (PC)
thus append 12B0,adrs.
94 00088C HEADER COMMACALL,5,',call',DOCOLON
94.1 000000 PUBLIC COMMACALL
94.2 00088C .... DW link
94.3 00088E FF DB 0FFh ; not immediate
94.4 00088F link SET $
94.5 00088F 05 DB 5
94.6 000890 2C63616C6C DB ',call'
94.7 000895 00 EVEN
94.8 000896 IF 'DOCOLON'='DOCODE'
94.9 000896 COMMACALL: DW $+2
94.10 000896 ELSE
94.11 000896 .... COMMACALL: DW DOCOLON
94.12 000898 ENDIF
94.13 000898 ENDM
95 000898 ....B012....* DW lit,12B0h,ICOMMA,ICOMMA,EXIT
96 0008A2
97 0008A2 ;Z ,JMP adrs -- append an absolute
16-bit JMP (MOV #xx,PC)
98 0008A2 ; MSP430: opcode 4, Sreg=0000, Ad=0, As=11
(immed), Dreg=0000 (PC)
99 0008A2 ; thus append 4030,adrs.
100 0008A2 HEADER COMMAJMP,4,',jmp',DOCOLON
100.1 000000 PUBLIC COMMAJMP
100.2 0008A2 .... DW link
100.3 0008A4 FF DB 0FFh ; not immediate
100.4 0008A5 link SET $
100.5 0008A5 04 DB 4
100.6 0008A6 2C6A6D70 DB ',jmp'
100.7 0008AA EVEN
100.8 0008AA IF 'DOCOLON'='DOCODE'
100.9 0008AA COMMAJMP: DW $+2
100.10 0008AA ELSE
100.11 0008AA .... COMMAJMP: DW DOCOLON
100.12 0008AC ENDIF
100.13 0008AC ENDM
101 0008AC ....3040....* DW lit,4030h,ICOMMA,ICOMMA,EXIT
102 0008B6
103 0008B6 ;Z !COLON -- change code field to
DOCOLON
104 0008B6 ; -2 IALLOT DOCOLON-adrs ,CF ;
105 0008B6 ; This should be used immediately after
CREATE.
106 0008B6 ; This is made a distinct word, because on an
STC
107 0008B6 ; Forth, colon definitions have no code
field.
108 0008B6 HEADER STORCOLON,6,'!colon',DOCOLON
108.1 000000 PUBLIC STORCOLON
108.2 0008B6 .... DW link
108.3 0008B8 FF DB 0FFh ; not immediate
108.4 0008B9 link SET $
108.5 0008B9 06 DB 6
108.6 0008BA 21636F6C6F6E DB '!colon'
108.7 0008C0 EVEN
108.8 0008C0 IF 'DOCOLON'='DOCODE'
108.9 0008C0 STORCOLON: DW $+2
108.10 0008C0 ELSE
108.11 0008C0 .... STORCOLON: DW DOCOLON
108.12 0008C2 ENDIF
108.13 0008C2 ENDM
109 0008C2 ....FEFF.... DW lit,-2,IALLOT
110 0008C8 ............* DW lit,DOCOLON,COMMACF,EXIT
111 0008D0
112 0008D0 ;Z ,EXIT -- append hi-level EXIT
action
113 0008D0 ; ['] EXIT ,XT ;
114 0008D0 ; This is made a distinct word, because on an
STC
115 0008D0 ; Forth, it appends a RET instruction, not an
xt.
116 0008D0 HEADER CEXIT,5,',exit',DOCOLON
116.1 000000 PUBLIC CEXIT
116.2 0008D0 .... DW link
116.3 0008D2 FF DB 0FFh ; not immediate
116.4 0008D3 link SET $
116.5 0008D3 05 DB 5
116.6 0008D4 2C65786974 DB ',exit'
116.7 0008D9 00 EVEN
116.8 0008DA IF 'DOCOLON'='DOCODE'
116.9 0008DA CEXIT: DW $+2
116.10 0008DA ELSE
116.11 0008DA .... CEXIT: DW DOCOLON
116.12 0008DC ENDIF
116.13 0008DC ENDM
117 0008DC ............* DW lit,EXIT,COMMAXT,EXIT
118 0008E4
119 0008E4 ; ----------------------------------------------
------------------------
120 0008E4 ; CONTROL STRUCTURES
121 0008E4 ; These words allow Forth control structure
words
122 0008E4 ; to be defined portably.
123 0008E4
124 0008E4 ;Z ,BRANCH xt -- append a branch instructio
n
125 0008E4 ; xt is the branch operator to use, e.g. qbranch
or (loop).
126 0008E4 ; It does NOT append the destination address.
127 0008E4 ; On the MSP430 this is equivalent to ,XT
(above).
128 0008E4 HEADER COMMABRANCH,7,',branch',DOALIAS
128.1 000000 PUBLIC COMMABRANCH
128.2 0008E4 .... DW link
128.3 0008E6 FF DB 0FFh ; not immediate
128.4 0008E7 link SET $
128.5 0008E7 07 DB 7
128.6 0008E8 2C6272616E63* DB ',branch'
128.7 0008EF 00 EVEN
128.8 0008F0 IF 'DOALIAS'='DOCODE'
128.9 0008F0 COMMABRANCH: DW $+2
128.10 0008F0 ELSE
128.11 0008F0 .... COMMABRANCH: DW DOALIAS
128.12 0008F2 ENDIF
128.13 0008F2 ENDM
129 0008F2 .... DW ICOMMA
130 0008F4
131 0008F4 ;Z ,DEST dest -- append a branch
address
132 0008F4 ; IHERE - , ;
133 0008F4 ; This appends the given destination address to
the branch instruction.
134 0008F4 ; The MSP430 uses relative addressing from the
location of the offset cell,
135 0008F4 ; i.e., to branch to FOO the offset cell at $
contains FOO-$.
136 0008F4 HEADER COMMADEST,5,',dest',DOCOLON
136.1 000000 PUBLIC COMMADEST
136.2 0008F4 .... DW link
136.3 0008F6 FF DB 0FFh ; not immediate
136.4 0008F7 link SET $
136.5 0008F7 05 DB 5
136.6 0008F8 2C64657374 DB ',dest'
136.7 0008FD 00 EVEN
136.8 0008FE IF 'DOCOLON'='DOCODE'
136.9 0008FE COMMADEST: DW $+2
136.10 0008FE ELSE
136.11 0008FE .... COMMADEST: DW DOCOLON
136.12 000900 ENDIF
136.13 000900 ENDM
137 000900 ............* DW IHERE,MINUS,ICOMMA,EXIT
138 000908
139 000908 ;Z !DEST dest adrs -- change a branch
dest'n
140 000908 ; TUCK - SWAP I! ;
141 000908 ; Changes the destination address found at
'adrs' to the given 'dest'.
142 000908 ; The MSP430 uses relative addressing from the
location of the offset cell,
143 000908 ; i.e., to branch to FOO the offset cell at $
contains FOO-$.
144 000908 HEADER STOREDEST,5,'!dest',DOCOLON
144.1 000000 PUBLIC STOREDEST
144.2 000908 .... DW link
144.3 00090A FF DB 0FFh ; not immediate
144.4 00090B link SET $
144.5 00090B 05 DB 5
144.6 00090C 2164657374 DB '!dest'
144.7 000911 00 EVEN
144.8 000912 IF 'DOCOLON'='DOCODE'
144.9 000912 STOREDEST: DW $+2
144.10 000912 ELSE
144.11 000912 .... STOREDEST: DW DOCOLON
144.12 000914 ENDIF
144.13 000914 ENDM
145 000914 ............* DW TUCK,MINUS,SWAP,ISTORE,EXIT
146 00091E
147 00091E ;Z ,NONE -- append a null
destination (Flashable)
148 00091E ; CELL IALLOT ;
149 00091E ; When compiling in Flash ROM a branch to be
resolved later, we must
150 00091E ; skip the cell so that it can be programmed at
a later time.
151 00091E ; In general Flash memory can only be written
once!
152 00091E ; ,NONE should be used wherever !DEST will
resolve the branch.
153 00091E HEADER COMMANONE,5,',none',DOCOLON
153.1 000000 PUBLIC COMMANONE
153.2 00091E .... DW link
153.3 000920 FF DB 0FFh ; not immediate
153.4 000921 link SET $
153.5 000921 05 DB 5
153.6 000922 2C6E6F6E65 DB ',none'
153.7 000927 00 EVEN
153.8 000928 IF 'DOCOLON'='DOCODE'
153.9 000928 COMMANONE: DW $+2
153.10 000928 ELSE
153.11 000928 .... COMMANONE: DW DOCOLON
153.12 00092A ENDIF
153.13 00092A ENDM
154 00092A ............ DW CELL,IALLOT,EXIT
155 000930
156 000930 ; ----------------------------------------------
------------------------
157 000930 ; HEADER STRUCTURE
158 000930 ; The structure of the Forth dictionary headers
(name, link, immediate
159 000930 ; flag, and "smudge" bit) does not necessarily
differ across CPUs. This
160 000930 ; structure is not easily factored into distinct
"portable" words;
161 000930 ; instead, it is implicit in the definitions of
FIND and CREATE, and
162 000930 ; also in NFA>LFA, NFA>CFA, IMMED?, IMMEDIATE,
HIDE, and REVEAL.
163 000930 ; These words must be (substantially) rewritten
if either the header
164 000930 ; structure or its inherent assumptions are
changed.
165 000930
921 000930 #include "se-hilvl430G2553.s43"
1 000930 ; ----------------------------------------------
------------------------
2 000930 ; CamelForth for the Texas Instruments MSP430
3 000930 ; (c) 2009 Bradford J. Rodriguez.
4 000930 ;
5 000930 ; This program is free software; you can
redistribute it and/or modify
6 000930 ; it under the terms of the GNU General Public
License as published by
7 000930 ; the Free Software Foundation; either version 3
of the License, or
8 000930 ; (at your option) any later version.
9 000930 ;
10 000930 ; This program is distributed in the hope that
it will be useful,
11 000930 ; but WITHOUT ANY WARRANTY; without even the
implied warranty of
12 000930 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the
13 000930 ; GNU General Public License for more details.
14 000930 ;
15 000930 ; You should have received a copy of the GNU
General Public License
16 000930 ; along with this program. If not, see
.
17 000930 ;
18 000930 ; Commercial inquiries should be directed to the
author at
19 000930 ; 115 First St., #105, Collingwood, Ontario L9Y
4W3 Canada
20 000930 ; or via email to bj@camelforth.com
21 000930 ; ----------------------------------------------
------------------------
22 000930 ; hilvl430.s43 - High Level Words - MSP430F1611
23 000930 ; B. Rodriguez 4 Jan 09
24 000930
25 000930 ; Forth words are documented as follows:
26 000930 ;x NAME stack -- stack description
27 000930 ; where x=C for ANS Forth Core words, X for
ANS
28 000930 ; Extensions, Z for internal or private
words.
29 000930 ; ----------------------------------------------
------------------------
30 000930 ; REVISION HISTORY
31 000930
32 000930 ; 30 Mar 2012 mk fixed FM/MOD
33 000930 ; 26 Feb 2012 mk - adopted to MSP430G2553
34 000930 ; MEM ( -- n ) n = bytes left in flash
35 000930 ; FLASHEND constant MEMTOP
36 000930 ; FLASHSTART constant MEMBOT
37 000930 ; kernel at $E000, IDP = FLASHSTART =
C000
38 000930 ; fixed backspace.
39 000930 ; ok promt at end of line.
40 000930 ; .S prints depth.
41 000930 ;
42 000930 ; 17 jan 09 bjr - changed label _DP to DDP for
compatibility with token
43 000930 ; naming convention. Now uses DEST macro to
compute branch offsets.
44 000930 ; 11 jan 09 bjr - modified QUIT for Xon/Xoff
flow control
45 000930 ; 4 jan 09 bjr - created from Camel86h.asm.
46 000930
47 000930 ; SYSTEM VARIABLES & CONSTANTS =================
=
48 000930
49 000930 ;Z u0 -- a-addr current user area
adrs
50 000930 ; 0 USER U0
51 000930 HEADER U0,2,'u0',DOUSER
51.1 000000 PUBLIC U0
51.2 000930 .... DW link
51.3 000932 FF DB 0FFh ; not immediate
51.4 000933 link SET $
51.5 000933 02 DB 2
51.6 000934 7530 DB 'u0'
51.7 000936 EVEN
51.8 000936 IF 'DOUSER'='DOCODE'
51.9 000936 U0: DW $+2
51.10 000936 ELSE
51.11 000936 .... U0: DW DOUSER
51.12 000938 ENDIF
51.13 000938 ENDM
52 000938 0000 DW 0
53 00093A
54 00093A ;C >IN -- a-addr holds offset into
TIB
55 00093A ; 2 USER >IN
56 00093A HEADER TOIN,3,'>in',DOUSER
56.1 000000 PUBLIC TOIN
56.2 00093A .... DW link
56.3 00093C FF DB 0FFh ; not immediate
56.4 00093D link SET $
56.5 00093D 03 DB 3
56.6 00093E 3E696E DB '>in'
56.7 000941 00 EVEN
56.8 000942 IF 'DOUSER'='DOCODE'
56.9 000942 TOIN: DW $+2
56.10 000942 ELSE
56.11 000942 .... TOIN: DW DOUSER
56.12 000944 ENDIF
56.13 000944 ENDM
57 000944 0200 DW 2
58 000946
59 000946 ;C BASE -- a-addr holds conversion
radix
60 000946 ; 4 USER BASE
61 000946 HEADER BASE,4,'base',DOUSER
61.1 000000 PUBLIC BASE
61.2 000946 .... DW link
61.3 000948 FF DB 0FFh ; not immediate
61.4 000949 link SET $
61.5 000949 04 DB 4
61.6 00094A 62617365 DB 'base'
61.7 00094E EVEN
61.8 00094E IF 'DOUSER'='DOCODE'
61.9 00094E BASE: DW $+2
61.10 00094E ELSE
61.11 00094E .... BASE: DW DOUSER
61.12 000950 ENDIF
61.13 000950 ENDM
62 000950 0400 DW 4
63 000952
64 000952 ;C STATE -- a-addr holds compiler
state
65 000952 ; 6 USER STATE
66 000952 HEADER STATE,5,'state',DOUSER
66.1 000000 PUBLIC STATE
66.2 000952 .... DW link
66.3 000954 FF DB 0FFh ; not immediate
66.4 000955 link SET $
66.5 000955 05 DB 5
66.6 000956 7374617465 DB 'state'
66.7 00095B 00 EVEN
66.8 00095C IF 'DOUSER'='DOCODE'
66.9 00095C STATE: DW $+2
66.10 00095C ELSE
66.11 00095C .... STATE: DW DOUSER
66.12 00095E ENDIF
66.13 00095E ENDM
67 00095E 0600 DW 6
68 000960
69 000960 ;Z dp -- a-addr holds dictionary
ptr
70 000960 ; 8 USER DP
71 000960 HEADER DDP,2,'dp',DOUSER
71.1 000000 PUBLIC DDP
71.2 000960 .... DW link
71.3 000962 FF DB 0FFh ; not immediate
71.4 000963 link SET $
71.5 000963 02 DB 2
71.6 000964 6470 DB 'dp'
71.7 000966 EVEN
71.8 000966 IF 'DOUSER'='DOCODE'
71.9 000966 DDP: DW $+2
71.10 000966 ELSE
71.11 000966 .... DDP: DW DOUSER
71.12 000968 ENDIF
71.13 000968 ENDM
72 000968 0800 DW 8
73 00096A
74 00096A ;Z 'source -- a-addr two cells: len,
adrs
75 00096A ; 10 USER 'SOURCE
76 00096A HEADER TICKSOURCE,7,'\'source',DOUSER
76.1 000000 PUBLIC TICKSOURCE
76.2 00096A .... DW link
76.3 00096C FF DB 0FFh ; not immediate
76.4 00096D link SET $
76.5 00096D 07 DB 7
76.6 00096E 27736F757263* DB '\'source'
76.7 000975 00 EVEN
76.8 000976 IF 'DOUSER'='DOCODE'
76.9 000976 TICKSOURCE: DW $+2
76.10 000976 ELSE
76.11 000976 .... TICKSOURCE: DW DOUSER
76.12 000978 ENDIF
76.13 000978 ENDM
77 000978 0A00 DW 10
78 00097A
79 00097A ;Z latest -- a-addr last word in
dict.
80 00097A ; 14 USER LATEST
81 00097A HEADER LATEST,6,'latest',DOUSER
81.1 000000 PUBLIC LATEST
81.2 00097A .... DW link
81.3 00097C FF DB 0FFh ; not immediate
81.4 00097D link SET $
81.5 00097D 06 DB 6
81.6 00097E 6C6174657374 DB 'latest'
81.7 000984 EVEN
81.8 000984 IF 'DOUSER'='DOCODE'
81.9 000984 LATEST: DW $+2
81.10 000984 ELSE
81.11 000984 .... LATEST: DW DOUSER
81.12 000986 ENDIF
81.13 000986 ENDM
82 000986 0E00 DW 14
83 000988
84 000988 ;Z hp -- a-addr HOLD pointer
85 000988 ; 16 USER HP
86 000988 HEADER HP,2,'hp',DOUSER
86.1 000000 PUBLIC HP
86.2 000988 .... DW link
86.3 00098A FF DB 0FFh ; not immediate
86.4 00098B link SET $
86.5 00098B 02 DB 2
86.6 00098C 6870 DB 'hp'
86.7 00098E EVEN
86.8 00098E IF 'DOUSER'='DOCODE'
86.9 00098E HP: DW $+2
86.10 00098E ELSE
86.11 00098E .... HP: DW DOUSER
86.12 000990 ENDIF
86.13 000990 ENDM
87 000990 1000 DW 16
88 000992
89 000992 ;Z LP -- a-addr Leave-stack pointer
90 000992 ; 18 USER LP
91 000992 HEADER LP,2,'lp',DOUSER
91.1 000000 PUBLIC LP
91.2 000992 .... DW link
91.3 000994 FF DB 0FFh ; not immediate
91.4 000995 link SET $
91.5 000995 02 DB 2
91.6 000996 6C70 DB 'lp'
91.7 000998 EVEN
91.8 000998 IF 'DOUSER'='DOCODE'
91.9 000998 LP: DW $+2
91.10 000998 ELSE
91.11 000998 .... LP: DW DOUSER
91.12 00099A ENDIF
91.13 00099A ENDM
92 00099A 1200 DW 18
93 00099C
94 00099C ;Z IDP -- a-addr ROM dictionary
pointer
95 00099C ; 20 USER IDP
96 00099C HEADER IDP,3,'idp',DOUSER
96.1 000000 PUBLIC IDP
96.2 00099C .... DW link
96.3 00099E FF DB 0FFh ; not immediate
96.4 00099F link SET $
96.5 00099F 03 DB 3
96.6 0009A0 696470 DB 'idp'
96.7 0009A3 00 EVEN
96.8 0009A4 IF 'DOUSER'='DOCODE'
96.9 0009A4 IDP: DW $+2
96.10 0009A4 ELSE
96.11 0009A4 .... IDP: DW DOUSER
96.12 0009A6 ENDIF
96.13 0009A6 ENDM
97 0009A6 1400 DW 20
98 0009A8
99 0009A8 ;Z NEWEST -- a-addr temporary LATEST
storage
100 0009A8 ; 22 USER NEWEST
101 0009A8 HEADER NEWEST,6,'newest',DOUSER
101.1 000000 PUBLIC NEWEST
101.2 0009A8 .... DW link
101.3 0009AA FF DB 0FFh ; not immediate
101.4 0009AB link SET $
101.5 0009AB 06 DB 6
101.6 0009AC 6E6577657374 DB 'newest'
101.7 0009B2 EVEN
101.8 0009B2 IF 'DOUSER'='DOCODE'
101.9 0009B2 NEWEST: DW $+2
101.10 0009B2 ELSE
101.11 0009B2 .... NEWEST: DW DOUSER
101.12 0009B4 ENDIF
101.13 0009B4 ENDM
102 0009B4 1600 DW 22
103 0009B6
104 0009B6 ;Z APP -- a-addr xt of app ( was
TURNKEY)
105 0009B6 ; 24 USER APP
106 0009B6 HEADER APP,3,'app',DOUSER
106.1 000000 PUBLIC APP
106.2 0009B6 .... DW link
106.3 0009B8 FF DB 0FFh ; not immediate
106.4 0009B9 link SET $
106.5 0009B9 03 DB 3
106.6 0009BA 617070 DB 'app'
106.7 0009BD 00 EVEN
106.8 0009BE IF 'DOUSER'='DOCODE'
106.9 0009BE APP: DW $+2
106.10 0009BE ELSE
106.11 0009BE .... APP: DW DOUSER
106.12 0009C0 ENDIF
106.13 0009C0 ENDM
107 0009C0 1800 DW 24
108 0009C2
109 0009C2 ;Z CAPS -- a-addr capitalize
words
110 0009C2 ; 26 USER CAPS
111 0009C2 HEADER CAPS,4,'caps',DOUSER
111.1 000000 PUBLIC CAPS
111.2 0009C2 .... DW link
111.3 0009C4 FF DB 0FFh ; not immediate
111.4 0009C5 link SET $
111.5 0009C5 04 DB 4
111.6 0009C6 63617073 DB 'caps'
111.7 0009CA EVEN
111.8 0009CA IF 'DOUSER'='DOCODE'
111.9 0009CA CAPS: DW $+2
111.10 0009CA ELSE
111.11 0009CA .... CAPS: DW DOUSER
111.12 0009CC ENDIF
111.13 0009CC ENDM
112 0009CC 1A00 DW 26
113 0009CE
114 0009CE ;Z emitvec -- a-addr xt of emit
115 0009CE ; 28 USER CAPS
116 0009CE HEADER EMITVEC,7,'emitvec',DOUSER
116.1 000000 PUBLIC EMITVEC
116.2 0009CE .... DW link
116.3 0009D0 FF DB 0FFh ; not immediate
116.4 0009D1 link SET $
116.5 0009D1 07 DB 7
116.6 0009D2 656D69747665* DB 'emitvec'
116.7 0009D9 00 EVEN
116.8 0009DA IF 'DOUSER'='DOCODE'
116.9 0009DA EMITVEC: DW $+2
116.10 0009DA ELSE
116.11 0009DA .... EMITVEC: DW DOUSER
116.12 0009DC ENDIF
116.13 0009DC ENDM
117 0009DC 1C00 DW 28
118 0009DE
119 0009DE ; user variables 30 tbd
120 0009DE
121 0009DE ;X PAD -- a-addr user PAD buffer
122 0009DE ; = end of hold
area!
123 0009DE HEADER PAD,3,'pad',DOUSER
123.1 000000 PUBLIC PAD
123.2 0009DE .... DW link
123.3 0009E0 FF DB 0FFh ; not immediate
123.4 0009E1 link SET $
123.5 0009E1 03 DB 3
123.6 0009E2 706164 DB 'pad'
123.7 0009E5 00 EVEN
123.8 0009E6 IF 'DOUSER'='DOCODE'
123.9 0009E6 PAD: DW $+2
123.10 0009E6 ELSE
123.11 0009E6 .... PAD: DW DOUSER
123.12 0009E8 ENDIF
123.13 0009E8 ENDM
124 0009E8 .... DW PADAREA-UAREA
125 0009EA
126 0009EA ;Z l0 -- a-addr bottom of Leave
stack
127 0009EA HEADER L0,2,'l0',DOUSER
127.1 000000 PUBLIC L0
127.2 0009EA .... DW link
127.3 0009EC FF DB 0FFh ; not immediate
127.4 0009ED link SET $
127.5 0009ED 02 DB 2
127.6 0009EE 6C30 DB 'l0'
127.7 0009F0 EVEN
127.8 0009F0 IF 'DOUSER'='DOCODE'
127.9 0009F0 L0: DW $+2
127.10 0009F0 ELSE
127.11 0009F0 .... L0: DW DOUSER
127.12 0009F2 ENDIF
127.13 0009F2 ENDM
128 0009F2 .... DW LSTACK-UAREA
129 0009F4
130 0009F4 ;Z r0 -- a-addr end of return
stack
131 0009F4 HEADER RZERO,2,'r0',DOUSER
131.1 000000 PUBLIC RZERO
131.2 0009F4 .... DW link
131.3 0009F6 FF DB 0FFh ; not immediate
131.4 0009F7 link SET $
131.5 0009F7 02 DB 2
131.6 0009F8 7230 DB 'r0'
131.7 0009FA EVEN
131.8 0009FA IF 'DOUSER'='DOCODE'
131.9 0009FA RZERO: DW $+2
131.10 0009FA ELSE
131.11 0009FA .... RZERO: DW DOUSER
131.12 0009FC ENDIF
131.13 0009FC ENDM
132 0009FC .... DW RSTACK-UAREA
133 0009FE
134 0009FE ;Z s0 -- a-addr end of parameter
stack
135 0009FE HEADER S0,2,'s0',DOUSER
135.1 000000 PUBLIC S0
135.2 0009FE .... DW link
135.3 000A00 FF DB 0FFh ; not immediate
135.4 000A01 link SET $
135.5 000A01 02 DB 2
135.6 000A02 7330 DB 's0'
135.7 000A04 EVEN
135.8 000A04 IF 'DOUSER'='DOCODE'
135.9 000A04 S0: DW $+2
135.10 000A04 ELSE
135.11 000A04 .... S0: DW DOUSER
135.12 000A06 ENDIF
135.13 000A06 ENDM
136 000A06 .... DW PSTACK-UAREA
137 000A08
138 000A08 ;X tib -- a-addr Terminal Input
Buffer
139 000A08 ; HEX 80 USER TIB 8086: above user
area
140 000A08 HEADER TIB,3,'tib',DOUSER
140.1 000000 PUBLIC TIB
140.2 000A08 .... DW link
140.3 000A0A FF DB 0FFh ; not immediate
140.4 000A0B link SET $
140.5 000A0B 03 DB 3
140.6 000A0C 746962 DB 'tib'
140.7 000A0F 00 EVEN
140.8 000A10 IF 'DOUSER'='DOCODE'
140.9 000A10 TIB: DW $+2
140.10 000A10 ELSE
140.11 000A10 .... TIB: DW DOUSER
140.12 000A12 ENDIF
140.13 000A12 ENDM
141 000A12 .... DW TIBAREA-UAREA
142 000A14
143 000A14 ;Z tibsize -- n size of TIB
144 000A14 HEADER TIBSIZE,7,'tibsize',DOCON
144.1 000000 PUBLIC TIBSIZE
144.2 000A14 .... DW link
144.3 000A16 FF DB 0FFh ; not immediate
144.4 000A17 link SET $
144.5 000A17 07 DB 7
144.6 000A18 74696273697A* DB 'tibsize'
144.7 000A1F 00 EVEN
144.8 000A20 IF 'DOCON'='DOCODE'
144.9 000A20 TIBSIZE: DW $+2
144.10 000A20 ELSE
144.11 000A20 .... TIBSIZE: DW DOCON
144.12 000A22 ENDIF
144.13 000A22 ENDM
145 000A22 .... DW TIB_SIZE-2 ; 2 chars safety zone
146 000A24
147 000A24 ;C BL -- char an ASCII
space
148 000A24 HEADER BLANK,2,'bl',DOCON
148.1 000000 PUBLIC BLANK
148.2 000A24 .... DW link
148.3 000A26 FF DB 0FFh ; not immediate
148.4 000A27 link SET $
148.5 000A27 02 DB 2
148.6 000A28 626C DB 'bl'
148.7 000A2A EVEN
148.8 000A2A IF 'DOCON'='DOCODE'
148.9 000A2A BLANK: DW $+2
148.10 000A2A ELSE
148.11 000A2A .... BLANK: DW DOCON
148.12 000A2C ENDIF
148.13 000A2C ENDM
149 000A2C 2000 DW 20h
150 000A2E
151 000A2E ;Z uinit -- addr initial values for user
area
152 000A2E ; MSP430: we also use this to initialize the RAM
interrupt
153 000A2E ; vectors, which immediately follow the user
area.
154 000A2E ; Per init430f1611.s43, allocate 16 cells for
user
155 000A2E ; variables, followed by 30 cells for interrupt
vectors.
156 000A2E HEADER UINIT,5,'uinit',DOROM
156.1 000000 PUBLIC UINIT
156.2 000A2E .... DW link
156.3 000A30 FF DB 0FFh ; not immediate
156.4 000A31 link SET $
156.5 000A31 05 DB 5
156.6 000A32 75696E6974 DB 'uinit'
156.7 000A37 00 EVEN
156.8 000A38 IF 'DOROM'='DOCODE'
156.9 000A38 UINIT: DW $+2
156.10 000A38 ELSE
156.11 000A38 .... UINIT: DW DOROM
156.12 000A3A ENDIF
156.13 000A3A ENDM
157 000A3A 000000000A00* DW 0,0,10,0 ; reserved,>IN,BASE,STAT
E ; start in HEX
mk
158 000A42 .... DW RAMDICT ; DP
159 000A44 00000000 DW 0,0 ; SOURCE init'd
elsewhere
160 000A48 .... DW lastword ; LATEST
161 000A4A 00000000 DW 0,0 ; HP,LP init'd
elsewhere
162 000A4E 00C0 DW FLASHSTART ; IDP
163 000A50 0000 DW 0 ; NEWEST not init'd
164 000A52 .... DW DOTCOLD ; app
165 000A54 0000 DW 0 ; CAPS off is default
166 000A56 0000 DW 0 ; EMIT ; XT of
EMIT
167 000A58 0000 DW 0 ; user variables
TBD
168 000A5A
169 000A5A /* not there mk
170 000A5A ; RAM interrupt vectors, 15 vectors of 2 cells
each
171 000A5A MOV #nullirq,PC
172 000A5A MOV #nullirq,PC
173 000A5A MOV #nullirq,PC
174 000A5A MOV #nullirq,PC
175 000A5A MOV #nullirq,PC
176 000A5A MOV #nullirq,PC
177 000A5A MOV #nullirq,PC
178 000A5A MOV #nullirq,PC
179 000A5A MOV #nullirq,PC
180 000A5A MOV #nullirq,PC
181 000A5A MOV #nullirq,PC
182 000A5A MOV #nullirq,PC
183 000A5A MOV #nullirq,PC
184 000A5A MOV #nullirq,PC
185 000A5A MOV #nullirq,PC
186 000A5A */
187 000A5A
188 000A5A ;Z #init -- n #bytes of user area init
data
189 000A5A HEADER NINIT,5,'#init',DOCON
189.1 000000 PUBLIC NINIT
189.2 000A5A .... DW link
189.3 000A5C FF DB 0FFh ; not immediate
189.4 000A5D link SET $
189.5 000A5D 05 DB 5
189.6 000A5E 23696E6974 DB '#init'
189.7 000A63 00 EVEN
189.8 000A64 IF 'DOCON'='DOCODE'
189.9 000A64 NINIT: DW $+2
189.10 000A64 ELSE
189.11 000A64 .... NINIT: DW DOCON
189.12 000A66 ENDIF
189.13 000A66 ENDM
190 000A66 .... DW (UAREA_SIZE)*2 ; SIZEs given in
cells
191 000A68
192 000A68
193 000000 EXTERN cor,infoB,AppU0
194 000A68 ;Z COR -- adr cause of reset
195 000A68 HEADER COR,3,'cor',DOCON
195.1 000000 PUBLIC COR
195.2 000A68 .... DW link
195.3 000A6A FF DB 0FFh ; not immediate
195.4 000A6B link SET $
195.5 000A6B 03 DB 3
195.6 000A6C 636F72 DB 'cor'
195.7 000A6F 00 EVEN
195.8 000A70 IF 'DOCON'='DOCODE'
195.9 000A70 COR: DW $+2
195.10 000A70 ELSE
195.11 000A70 .... COR: DW DOCON
195.12 000A72 ENDIF
195.13 000A72 ENDM
196 000A72 .... DW cor
197 000A74
198 000A74 ;Z INFOB -- adr start of info B
segment
199 000A74 HEADER INFOB,5,'infob',DOCON
199.1 000000 PUBLIC INFOB
199.2 000A74 .... DW link
199.3 000A76 FF DB 0FFh ; not immediate
199.4 000A77 link SET $
199.5 000A77 05 DB 5
199.6 000A78 696E666F62 DB 'infob'
199.7 000A7D 00 EVEN
199.8 000A7E IF 'DOCON'='DOCODE'
199.9 000A7E INFOB: DW $+2
199.10 000A7E ELSE
199.11 000A7E .... INFOB: DW DOCON
199.12 000A80 ENDIF
199.13 000A80 ENDM
200 000A80 .... DW infoB
201 000A82
202 000A82 ;Z APPU0 -- adr start of Application
user area
203 000A82 HEADER APPU0,5,'appu0',DOCON
203.1 000000 PUBLIC APPU0
203.2 000A82 .... DW link
203.3 000A84 FF DB 0FFh ; not immediate
203.4 000A85 link SET $
203.5 000A85 05 DB 5
203.6 000A86 6170707530 DB 'appu0'
203.7 000A8B 00 EVEN
203.8 000A8C IF 'DOCON'='DOCODE'
203.9 000A8C APPU0: DW $+2
203.10 000A8C ELSE
203.11 000A8C .... APPU0: DW DOCON
203.12 000A8E ENDIF
203.13 000A8E ENDM
204 000A8E .... DW AppU0
205 000A90
206 000A90
207 000A90 ; ARITHMETIC OPERATORS =========================
=
208 000A90
209 000A90 ;C S>D n -- d single -> double
prec.
210 000A90 ; DUP 0< ;
211 000A90 HEADER STOD,3,'s>d',DOCOLON
211.1 000000 PUBLIC STOD
211.2 000A90 .... DW link
211.3 000A92 FF DB 0FFh ; not immediate
211.4 000A93 link SET $
211.5 000A93 03 DB 3
211.6 000A94 733E64 DB 's>d'
211.7 000A97 00 EVEN
211.8 000A98 IF 'DOCOLON'='DOCODE'
211.9 000A98 STOD: DW $+2
211.10 000A98 ELSE
211.11 000A98 .... STOD: DW DOCOLON
211.12 000A9A ENDIF
211.13 000A9A ENDM
212 000A9A ............ DW DUP,ZEROLESS,EXIT
213 000AA0
214 000AA0 ;Z ?NEGATE n1 n2 -- n3 negate n1 if n2
negative
215 000AA0 ; 0< IF NEGATE THEN ; ...a common
factor
216 000AA0 HEADER QNEGATE,7,'?negate',DOCOLON
216.1 000000 PUBLIC QNEGATE
216.2 000AA0 .... DW link
216.3 000AA2 FF DB 0FFh ; not immediate
216.4 000AA3 link SET $
216.5 000AA3 07 DB 7
216.6 000AA4 3F6E65676174* DB '?negate'
216.7 000AAB 00 EVEN
216.8 000AAC IF 'DOCOLON'='DOCODE'
216.9 000AAC QNEGATE: DW $+2
216.10 000AAC ELSE
216.11 000AAC .... QNEGATE: DW DOCOLON
216.12 000AAE ENDIF
216.13 000AAE ENDM
217 000AAE ........ DW ZEROLESS,qbran
218 000AB2 DEST QNEG1
218.1 000AB2 0400 DW QNEG1-$
218.2 000AB4 ENDM
219 000AB4 .... DW NEGATE
220 000AB6 .... QNEG1: DW EXIT
221 000AB8
222 000AB8 ;C ABS n1 -- +n2 absolute value
223 000AB8 ; DUP ?NEGATE ;
224 000AB8 HEADER ABBS,3,'abs',DOCOLON
224.1 000000 PUBLIC ABBS
224.2 000AB8 .... DW link
224.3 000ABA FF DB 0FFh ; not immediate
224.4 000ABB link SET $
224.5 000ABB 03 DB 3
224.6 000ABC 616273 DB 'abs'
224.7 000ABF 00 EVEN
224.8 000AC0 IF 'DOCOLON'='DOCODE'
224.9 000AC0 ABBS: DW $+2
224.10 000AC0 ELSE
224.11 000AC0 .... ABBS: DW DOCOLON
224.12 000AC2 ENDIF
224.13 000AC2 ENDM
225 000AC2 ............ DW DUP,QNEGATE,EXIT
226 000AC8
227 000AC8 ;X DNEGATE d1 -- d2 negate double
precision
228 000AC8 ; SWAP INVERT SWAP INVERT 1 M+ ;
229 000AC8 HEADER DNEGATE,7,'dnegate',DOCOLON
229.1 000000 PUBLIC DNEGATE
229.2 000AC8 .... DW link
229.3 000ACA FF DB 0FFh ; not immediate
229.4 000ACB link SET $
229.5 000ACB 07 DB 7
229.6 000ACC 646E65676174* DB 'dnegate'
229.7 000AD3 00 EVEN
229.8 000AD4 IF 'DOCOLON'='DOCODE'
229.9 000AD4 DNEGATE: DW $+2
229.10 000AD4 ELSE
229.11 000AD4 .... DNEGATE: DW DOCOLON
229.12 000AD6 ENDIF
229.13 000AD6 ENDM
230 000AD6 ............* DW SWAP,INVERT,SWAP,INVERT,lit,1,MPLUS
231 000AE4 .... DW EXIT
232 000AE6
233 000AE6 ;Z ?DNEGATE d1 n -- d2 negate d1 if n
negative
234 000AE6 ; 0< IF DNEGATE THEN ; ...a common
factor
235 000AE6 HEADER QDNEGATE,8,'?dnegate',DOCOLON
235.1 000000 PUBLIC QDNEGATE
235.2 000AE6 .... DW link
235.3 000AE8 FF DB 0FFh ; not immediate
235.4 000AE9 link SET $
235.5 000AE9 08 DB 8
235.6 000AEA 3F646E656761* DB '?dnegate'
235.7 000AF2 EVEN
235.8 000AF2 IF 'DOCOLON'='DOCODE'
235.9 000AF2 QDNEGATE: DW $+2
235.10 000AF2 ELSE
235.11 000AF2 .... QDNEGATE: DW DOCOLON
235.12 000AF4 ENDIF
235.13 000AF4 ENDM
236 000AF4 ........ DW ZEROLESS,qbran
237 000AF8 DEST DNEG1
237.1 000AF8 0400 DW DNEG1-$
237.2 000AFA ENDM
238 000AFA .... DW DNEGATE
239 000AFC .... DNEG1: DW EXIT
240 000AFE
241 000AFE ;X DABS d1 -- +d2 absolute value
dbl.prec.
242 000AFE ; DUP ?DNEGATE ;
243 000AFE HEADER DABS,4,'dabs',DOCOLON
243.1 000000 PUBLIC DABS
243.2 000AFE .... DW link
243.3 000B00 FF DB 0FFh ; not immediate
243.4 000B01 link SET $
243.5 000B01 04 DB 4
243.6 000B02 64616273 DB 'dabs'
243.7 000B06 EVEN
243.8 000B06 IF 'DOCOLON'='DOCODE'
243.9 000B06 DABS: DW $+2
243.10 000B06 ELSE
243.11 000B06 .... DABS: DW DOCOLON
243.12 000B08 ENDIF
243.13 000B08 ENDM
244 000B08 ............ DW DUP,QDNEGATE,EXIT
245 000B0E
246 000B0E ;C M* n1 n2 -- d signed 16*16->32
multiply
247 000B0E ; 2DUP XOR >R carries sign of the
result
248 000B0E ; SWAP ABS SWAP ABS UM*
249 000B0E ; R> ?DNEGATE ;
250 000B0E HEADER MSTAR,2,'m*',DOCOLON
250.1 000000 PUBLIC MSTAR
250.2 000B0E .... DW link
250.3 000B10 FF DB 0FFh ; not immediate
250.4 000B11 link SET $
250.5 000B11 02 DB 2
250.6 000B12 6D2A DB 'm*'
250.7 000B14 EVEN
250.8 000B14 IF 'DOCOLON'='DOCODE'
250.9 000B14 MSTAR: DW $+2
250.10 000B14 ELSE
250.11 000B14 .... MSTAR: DW DOCOLON
250.12 000B16 ENDIF
250.13 000B16 ENDM
251 000B16 ............ DW TWODUP,XORR,TOR
252 000B1C ............* DW SWAP,ABBS,SWAP,ABBS,UMSTAR
253 000B26 ............ DW RFROM,QDNEGATE,EXIT
254 000B2C
255 000B2C ;C SM/REM d1 n1 -- n2 n3 symmetric signed
div
256 000B2C ; 2DUP XOR >R sign of quotient
257 000B2C ; OVER >R sign of remainder
258 000B2C ; ABS >R DABS R> UM/MOD
259 000B2C ; SWAP R> ?NEGATE
260 000B2C ; SWAP R> ?NEGATE ;
261 000B2C ; Ref. dpANS-6 section 3.2.2.1.
262 000B2C HEADER SMSLASHREM,6,'sm/rem',DOCOLON
262.1 000000 PUBLIC SMSLASHREM
262.2 000B2C .... DW link
262.3 000B2E FF DB 0FFh ; not immediate
262.4 000B2F link SET $
262.5 000B2F 06 DB 6
262.6 000B30 736D2F72656D DB 'sm/rem'
262.7 000B36 EVEN
262.8 000B36 IF 'DOCOLON'='DOCODE'
262.9 000B36 SMSLASHREM: DW $+2
262.10 000B36 ELSE
262.11 000B36 .... SMSLASHREM: DW DOCOLON
262.12 000B38 ENDIF
262.13 000B38 ENDM
263 000B38 ............* DW TWODUP,XORR,TOR,OVER,TOR
264 000B42 ............* DW ABBS,TOR,DABS,RFROM,UMSLASHMOD
265 000B4C ............* DW SWAP,RFROM,QNEGATE,SWAP,RFROM,QNEGATE
266 000B58 .... DW EXIT
267 000B5A
268 000B5A ;C FM/MOD d1 n1 -- n2 n3 floored signed
div'n
269 000B5A ; Ching-Tang Tseng
Mar 24 2012
270 000B5A ; DUP >R OVER OVER XOR >R
271 000B5A ; SM/REM
272 000B5A ; OVER R> 0< AND
273 000B5A ; IF SWAP R@ + SWAP 1 -
274 000B5A ; THEN R> DROP ;
275 000B5A ; 1 0 2 FM/MOD(OK) . . 0 1 ok
276 000B5A ; 7 0 9 FM/MOD(OK) . . 0 7 ok
277 000B5A ; Ref. dpANS-6 section 3.2.2.1.
278 000B5A HEADER FMSLASHMOD,6,'fm/mod',DOCOLON
278.1 000000 PUBLIC FMSLASHMOD
278.2 000B5A .... DW link
278.3 000B5C FF DB 0FFh ; not immediate
278.4 000B5D link SET $
278.5 000B5D 06 DB 6
278.6 000B5E 666D2F6D6F64 DB 'fm/mod'
278.7 000B64 EVEN
278.8 000B64 IF 'DOCOLON'='DOCODE'
278.9 000B64 FMSLASHMOD: DW $+2
278.10 000B64 ELSE
278.11 000B64 .... FMSLASHMOD: DW DOCOLON
278.12 000B66 ENDIF
278.13 000B66 ENDM
279 000B66 ............* DW DUP,TOR,OVER,OVER,XORR,TOR
280 000B72 .... DW SMSLASHREM
281 000B74 ............* DW OVER,RFROM,ZEROLESS,ANDD,qbran
282 000B7E DEST FMMOD1
282.1 000B7E 0C00 DW FMMOD1-$
282.2 000B80 ENDM
283 000B80 ............* DW SWAP,RFETCH,PLUS,SWAP,ONEMINUS
284 000B8A ............ FMMOD1: DW RFROM,DROP,EXIT
285 000B90
286 000B90 ;C * n1 n2 -- n3 signed multiply
287 000B90 ; M* DROP ;
288 000B90 HEADER STAR,1,'*',DOCOLON
288.1 000000 PUBLIC STAR
288.2 000B90 .... DW link
288.3 000B92 FF DB 0FFh ; not immediate
288.4 000B93 link SET $
288.5 000B93 01 DB 1
288.6 000B94 2A DB '*'
288.7 000B95 00 EVEN
288.8 000B96 IF 'DOCOLON'='DOCODE'
288.9 000B96 STAR: DW $+2
288.10 000B96 ELSE
288.11 000B96 .... STAR: DW DOCOLON
288.12 000B98 ENDIF
288.13 000B98 ENDM
289 000B98 ............ DW MSTAR,DROP,EXIT
290 000B9E
291 000B9E ;C /MOD n1 n2 -- n3 n4 signed divide/rem'dr
292 000B9E ; >R S>D R> FM/MOD ;
293 000B9E HEADER SLASHMOD,4,'/mod',DOCOLON
293.1 000000 PUBLIC SLASHMOD
293.2 000B9E .... DW link
293.3 000BA0 FF DB 0FFh ; not immediate
293.4 000BA1 link SET $
293.5 000BA1 04 DB 4
293.6 000BA2 2F6D6F64 DB '/mod'
293.7 000BA6 EVEN
293.8 000BA6 IF 'DOCOLON'='DOCODE'
293.9 000BA6 SLASHMOD: DW $+2
293.10 000BA6 ELSE
293.11 000BA6 .... SLASHMOD: DW DOCOLON
293.12 000BA8 ENDIF
293.13 000BA8 ENDM
294 000BA8 ............* DW TOR,STOD,RFROM,FMSLASHMOD,EXIT
295 000BB2
296 000BB2 ;C / n1 n2 -- n3 signed divide
297 000BB2 ; /MOD nip ;
298 000BB2 HEADER SLASH,1,'/',DOCOLON
298.1 000000 PUBLIC SLASH
298.2 000BB2 .... DW link
298.3 000BB4 FF DB 0FFh ; not immediate
298.4 000BB5 link SET $
298.5 000BB5 01 DB 1
298.6 000BB6 2F DB '/'
298.7 000BB7 00 EVEN
298.8 000BB8 IF 'DOCOLON'='DOCODE'
298.9 000BB8 SLASH: DW $+2
298.10 000BB8 ELSE
298.11 000BB8 .... SLASH: DW DOCOLON
298.12 000BBA ENDIF
298.13 000BBA ENDM
299 000BBA ............ DW SLASHMOD,NIP,EXIT
300 000BC0
301 000BC0 ;C MOD n1 n2 -- n3 signed remainder
302 000BC0 ; /MOD DROP ;
303 000BC0 HEADER MODD,3,'mod',DOCOLON
303.1 000000 PUBLIC MODD
303.2 000BC0 .... DW link
303.3 000BC2 FF DB 0FFh ; not immediate
303.4 000BC3 link SET $
303.5 000BC3 03 DB 3
303.6 000BC4 6D6F64 DB 'mod'
303.7 000BC7 00 EVEN
303.8 000BC8 IF 'DOCOLON'='DOCODE'
303.9 000BC8 MODD: DW $+2
303.10 000BC8 ELSE
303.11 000BC8 .... MODD: DW DOCOLON
303.12 000BCA ENDIF
303.13 000BCA ENDM
304 000BCA ............ DW SLASHMOD,DROP,EXIT
305 000BD0
306 000BD0 ;C */MOD n1 n2 n3 -- n4 n5 n1*n2/n3,
rem"
307 000BD0 ; >R M* R> FM/MOD ;
308 000BD0 HEADER SSMOD,5,'*/mod',DOCOLON
308.1 000000 PUBLIC SSMOD
308.2 000BD0 .... DW link
308.3 000BD2 FF DB 0FFh ; not immediate
308.4 000BD3 link SET $
308.5 000BD3 05 DB 5
308.6 000BD4 2A2F6D6F64 DB '*/mod'
308.7 000BD9 00 EVEN
308.8 000BDA IF 'DOCOLON'='DOCODE'
308.9 000BDA SSMOD: DW $+2
308.10 000BDA ELSE
308.11 000BDA .... SSMOD: DW DOCOLON
308.12 000BDC ENDIF
308.13 000BDC ENDM
309 000BDC ............* DW TOR,MSTAR,RFROM,FMSLASHMOD,EXIT
310 000BE6
311 000BE6 ;C */ n1 n2 n3 -- n4 n1*n2/n3
312 000BE6 ; */MOD nip ;
313 000BE6 HEADER STARSLASH,2,'*/',DOCOLON
313.1 000000 PUBLIC STARSLASH
313.2 000BE6 .... DW link
313.3 000BE8 FF DB 0FFh ; not immediate
313.4 000BE9 link SET $
313.5 000BE9 02 DB 2
313.6 000BEA 2A2F DB '*/'
313.7 000BEC EVEN
313.8 000BEC IF 'DOCOLON'='DOCODE'
313.9 000BEC STARSLASH: DW $+2
313.10 000BEC ELSE
313.11 000BEC .... STARSLASH: DW DOCOLON
313.12 000BEE ENDIF
313.13 000BEE ENDM
314 000BEE ............ DW SSMOD,NIP,EXIT
315 000BF4
316 000BF4 ;C MAX n1 n2 -- n3 signed maximum
317 000BF4 ; 2DUP < IF SWAP THEN DROP ;
318 000BF4 HEADER MAX,3,'max',DOCOLON
318.1 000000 PUBLIC MAX
318.2 000BF4 .... DW link
318.3 000BF6 FF DB 0FFh ; not immediate
318.4 000BF7 link SET $
318.5 000BF7 03 DB 3
318.6 000BF8 6D6178 DB 'max'
318.7 000BFB 00 EVEN
318.8 000BFC IF 'DOCOLON'='DOCODE'
318.9 000BFC MAX: DW $+2
318.10 000BFC ELSE
318.11 000BFC .... MAX: DW DOCOLON
318.12 000BFE ENDIF
318.13 000BFE ENDM
319 000BFE ............ DW TWODUP,LESS,qbran
320 000C04 DEST MAX1
320.1 000C04 0400 DW MAX1-$
320.2 000C06 ENDM
321 000C06 .... DW SWAP
322 000C08 ........ MAX1: DW DROP,EXIT
323 000C0C
324 000C0C ;C MIN n1 n2 -- n3 signed minimum
325 000C0C ; 2DUP > IF SWAP THEN DROP ;
326 000C0C HEADER MIN,3,'min',DOCOLON
326.1 000000 PUBLIC MIN
326.2 000C0C .... DW link
326.3 000C0E FF DB 0FFh ; not immediate
326.4 000C0F link SET $
326.5 000C0F 03 DB 3
326.6 000C10 6D696E DB 'min'
326.7 000C13 00 EVEN
326.8 000C14 IF 'DOCOLON'='DOCODE'
326.9 000C14 MIN: DW $+2
326.10 000C14 ELSE
326.11 000C14 .... MIN: DW DOCOLON
326.12 000C16 ENDIF
326.13 000C16 ENDM
327 000C16 ............ DW TWODUP,GREATER,qbran
328 000C1C DEST MIN1
328.1 000C1C 0400 DW MIN1-$
328.2 000C1E ENDM
329 000C1E .... DW SWAP
330 000C20 ........ MIN1: DW DROP,EXIT
331 000C24
332 000C24 ; DOUBLE OPERATORS =============================
=
333 000C24
334 000C24 ;C 2@ a-addr -- x1 x2 fetch 2 cells
335 000C24 ; DUP CELL+ @ SWAP @ ;
336 000C24 ; the lower address will appear on top of
stack
337 000C24 HEADER TWOFETCH,2,'2@',DOCOLON
337.1 000000 PUBLIC TWOFETCH
337.2 000C24 .... DW link
337.3 000C26 FF DB 0FFh ; not immediate
337.4 000C27 link SET $
337.5 000C27 02 DB 2
337.6 000C28 3240 DB '2@'
337.7 000C2A EVEN
337.8 000C2A IF 'DOCOLON'='DOCODE'
337.9 000C2A TWOFETCH: DW $+2
337.10 000C2A ELSE
337.11 000C2A .... TWOFETCH: DW DOCOLON
337.12 000C2C ENDIF
337.13 000C2C ENDM
338 000C2C ............* DW DUP,CELLPLUS,FETCH,SWAP,FETCH,EXIT
339 000C38
340 000C38 ;C 2! x1 x2 a-addr -- store 2 cells
341 000C38 ; SWAP OVER ! CELL+ ! ;
342 000C38 ; the top of stack is stored at the lower
adrs
343 000C38 HEADER TWOSTORE,2,'2!',DOCOLON
343.1 000000 PUBLIC TWOSTORE
343.2 000C38 .... DW link
343.3 000C3A FF DB 0FFh ; not immediate
343.4 000C3B link SET $
343.5 000C3B 02 DB 2
343.6 000C3C 3221 DB '2!'
343.7 000C3E EVEN
343.8 000C3E IF 'DOCOLON'='DOCODE'
343.9 000C3E TWOSTORE: DW $+2
343.10 000C3E ELSE
343.11 000C3E .... TWOSTORE: DW DOCOLON
343.12 000C40 ENDIF
343.13 000C40 ENDM
344 000C40 ............* DW SWAP,OVER,STORE,CELLPLUS,STORE,EXIT
345 000C4C
346 000C4C ;C 2DROP x1 x2 -- drop 2 cells
347 000C4C ; DROP DROP ;
348 000C4C HEADER TWODROP,5,'2drop',DOCOLON
348.1 000000 PUBLIC TWODROP
348.2 000C4C .... DW link
348.3 000C4E FF DB 0FFh ; not immediate
348.4 000C4F link SET $
348.5 000C4F 05 DB 5
348.6 000C50 3264726F70 DB '2drop'
348.7 000C55 00 EVEN
348.8 000C56 IF 'DOCOLON'='DOCODE'
348.9 000C56 TWODROP: DW $+2
348.10 000C56 ELSE
348.11 000C56 .... TWODROP: DW DOCOLON
348.12 000C58 ENDIF
348.13 000C58 ENDM
349 000C58 ............ DW DROP,DROP,EXIT
350 000C5E
351 000C5E ;C 2DUP x1 x2 -- x1 x2 x1 x2 dup top 2
cells
352 000C5E ; OVER OVER ;
353 000C5E HEADER TWODUP,4,'2dup',DOCOLON
353.1 000000 PUBLIC TWODUP
353.2 000C5E .... DW link
353.3 000C60 FF DB 0FFh ; not immediate
353.4 000C61 link SET $
353.5 000C61 04 DB 4
353.6 000C62 32647570 DB '2dup'
353.7 000C66 EVEN
353.8 000C66 IF 'DOCOLON'='DOCODE'
353.9 000C66 TWODUP: DW $+2
353.10 000C66 ELSE
353.11 000C66 .... TWODUP: DW DOCOLON
353.12 000C68 ENDIF
353.13 000C68 ENDM
354 000C68 ............ DW OVER,OVER,EXIT
355 000C6E
356 000C6E ;C 2SWAP x1 x2 x3 x4 -- x3 x4 x1 x2 per
diagram
357 000C6E ; ROT >R ROT R> ;
358 000C6E HEADER TWOSWAP,5,'2swap',DOCOLON
358.1 000000 PUBLIC TWOSWAP
358.2 000C6E .... DW link
358.3 000C70 FF DB 0FFh ; not immediate
358.4 000C71 link SET $
358.5 000C71 05 DB 5
358.6 000C72 3273776170 DB '2swap'
358.7 000C77 00 EVEN
358.8 000C78 IF 'DOCOLON'='DOCODE'
358.9 000C78 TWOSWAP: DW $+2
358.10 000C78 ELSE
358.11 000C78 .... TWOSWAP: DW DOCOLON
358.12 000C7A ENDIF
358.13 000C7A ENDM
359 000C7A ............* DW ROT,TOR,ROT,RFROM,EXIT
360 000C84
361 000C84 ;C 2OVER x1 x2 x3 x4 -- x1 x2 x3 x4 x1
x2
362 000C84 ; >R >R 2DUP R> R> 2SWAP ;
363 000C84 HEADER TWOOVER,5,'2over',DOCOLON
363.1 000000 PUBLIC TWOOVER
363.2 000C84 .... DW link
363.3 000C86 FF DB 0FFh ; not immediate
363.4 000C87 link SET $
363.5 000C87 05 DB 5
363.6 000C88 326F766572 DB '2over'
363.7 000C8D 00 EVEN
363.8 000C8E IF 'DOCOLON'='DOCODE'
363.9 000C8E TWOOVER: DW $+2
363.10 000C8E ELSE
363.11 000C8E .... TWOOVER: DW DOCOLON
363.12 000C90 ENDIF
363.13 000C90 ENDM
364 000C90 ............* DW TOR,TOR,TWODUP,RFROM,RFROM
365 000C9A ........ DW TWOSWAP,EXIT
366 000C9E
367 000C9E ; INPUT/OUTPUT =================================
=
368 000C9E
369 000C9E ;C COUNT c-addr1 -- c-addr2 u counted->adr/le
n
370 000C9E ; DUP CHAR+ SWAP C@ ;
371 000C9E HEADER COUNT,5,'count',DOCOLON
371.1 000000 PUBLIC COUNT
371.2 000C9E .... DW link
371.3 000CA0 FF DB 0FFh ; not immediate
371.4 000CA1 link SET $
371.5 000CA1 05 DB 5
371.6 000CA2 636F756E74 DB 'count'
371.7 000CA7 00 EVEN
371.8 000CA8 IF 'DOCOLON'='DOCODE'
371.9 000CA8 COUNT: DW $+2
371.10 000CA8 ELSE
371.11 000CA8 .... COUNT: DW DOCOLON
371.12 000CAA ENDIF
371.13 000CAA ENDM
372 000CAA ............* DW DUP,CHARPLUS,SWAP,CFETCH,EXIT
373 000CB4
374 000CB4 ;C CR -- output newline
375 000CB4 ; 0D EMIT 0A EMIT ;
376 000CB4 HEADER CR,2,'cr',DOCOLON
376.1 000000 PUBLIC CR
376.2 000CB4 .... DW link
376.3 000CB6 FF DB 0FFh ; not immediate
376.4 000CB7 link SET $
376.5 000CB7 02 DB 2
376.6 000CB8 6372 DB 'cr'
376.7 000CBA EVEN
376.8 000CBA IF 'DOCOLON'='DOCODE'
376.9 000CBA CR: DW $+2
376.10 000CBA ELSE
376.11 000CBA .... CR: DW DOCOLON
376.12 000CBC ENDIF
376.13 000CBC ENDM
377 000CBC ....0D00....* DW lit,0dh,EMIT,lit,0ah,EMIT,EXIT
378 000CCA
379 000CCA ;C SPACE -- output a space
380 000CCA ; BL EMIT ;
381 000CCA HEADER SPACE,5,'space',DOCOLON
381.1 000000 PUBLIC SPACE
381.2 000CCA .... DW link
381.3 000CCC FF DB 0FFh ; not immediate
381.4 000CCD link SET $
381.5 000CCD 05 DB 5
381.6 000CCE 7370616365 DB 'space'
381.7 000CD3 00 EVEN
381.8 000CD4 IF 'DOCOLON'='DOCODE'
381.9 000CD4 SPACE: DW $+2
381.10 000CD4 ELSE
381.11 000CD4 .... SPACE: DW DOCOLON
381.12 000CD6 ENDIF
381.13 000CD6 ENDM
382 000CD6 ............ DW BLANK,EMIT,EXIT
383 000CDC
384 000CDC ;C SPACES n -- output n spaces
385 000CDC ; BEGIN DUP WHILE SPACE 1- REPEAT DROP
;
386 000CDC HEADER SPACES,6,'spaces',DOCOLON
386.1 000000 PUBLIC SPACES
386.2 000CDC .... DW link
386.3 000CDE FF DB 0FFh ; not immediate
386.4 000CDF link SET $
386.5 000CDF 06 DB 6
386.6 000CE0 737061636573 DB 'spaces'
386.7 000CE6 EVEN
386.8 000CE6 IF 'DOCOLON'='DOCODE'
386.9 000CE6 SPACES: DW $+2
386.10 000CE6 ELSE
386.11 000CE6 .... SPACES: DW DOCOLON
386.12 000CE8 ENDIF
386.13 000CE8 ENDM
387 000CE8 ........ SPCS1: DW DUP,qbran
388 000CEC DEST SPCS2
388.1 000CEC 0A00 DW SPCS2-$
388.2 000CEE ENDM
389 000CEE ............ DW SPACE,ONEMINUS,bran
390 000CF4 DEST SPCS1
390.1 000CF4 F4FF DW SPCS1-$
390.2 000CF6 ENDM
391 000CF6 ........ SPCS2: DW DROP,EXIT
392 000CFA
393 000CFA ;Z umin u1 u2 -- u unsigned minimum
394 000CFA ; 2DUP U> IF SWAP THEN DROP ;
395 000CFA HEADER UMIN,4,'umin',DOCOLON
395.1 000000 PUBLIC UMIN
395.2 000CFA .... DW link
395.3 000CFC FF DB 0FFh ; not immediate
395.4 000CFD link SET $
395.5 000CFD 04 DB 4
395.6 000CFE 756D696E DB 'umin'
395.7 000D02 EVEN
395.8 000D02 IF 'DOCOLON'='DOCODE'
395.9 000D02 UMIN: DW $+2
395.10 000D02 ELSE
395.11 000D02 .... UMIN: DW DOCOLON
395.12 000D04 ENDIF
395.13 000D04 ENDM
396 000D04 ............ DW TWODUP,UGREATER,qbran
397 000D0A DEST UMIN1
397.1 000D0A 0400 DW UMIN1-$
397.2 000D0C ENDM
398 000D0C .... DW SWAP
399 000D0E ........ UMIN1: DW DROP,EXIT
400 000D12
401 000D12 ;Z umax u1 u2 -- u unsigned maximum
402 000D12 ; 2DUP U< IF SWAP THEN DROP ;
403 000D12 HEADER UMAX,4,'umax',DOCOLON
403.1 000000 PUBLIC UMAX
403.2 000D12 .... DW link
403.3 000D14 FF DB 0FFh ; not immediate
403.4 000D15 link SET $
403.5 000D15 04 DB 4
403.6 000D16 756D6178 DB 'umax'
403.7 000D1A EVEN
403.8 000D1A IF 'DOCOLON'='DOCODE'
403.9 000D1A UMAX: DW $+2
403.10 000D1A ELSE
403.11 000D1A .... UMAX: DW DOCOLON
403.12 000D1C ENDIF
403.13 000D1C ENDM
404 000D1C ............ DW TWODUP,ULESS,qbran
405 000D22 DEST UMAX1
405.1 000D22 0400 DW UMAX1-$
405.2 000D24 ENDM
406 000D24 .... DW SWAP
407 000D26 ........ UMAX1: DW DROP,EXIT
408 000D2A
409 000D2A ;C ACCEPT c-addr +n -- +n' get line from
term'l
410 000D2A ; OVER + 1- OVER -- sa ea a
411 000D2A ; BEGIN KEY -- sa ea a c
412 000D2A ; DUP 0D <> WHILE
413 000D2A ; DUP EMIT -- sa ea a c
414 000D2A ; DUP 8 = IF DROP 1- >R OVER R>
UMAX
415 000D2A ; ELSE OVER C! 1+ OVER UMIN
416 000D2A ; THEN -- sa ea a
417 000D2A ; REPEAT -- sa ea a c
418 000D2A ; DROP NIP SWAP - ;
419 000D2A HEADER ACCEPT,6,'accept',DOCOLON
419.1 000000 PUBLIC ACCEPT
419.2 000D2A .... DW link
419.3 000D2C FF DB 0FFh ; not immediate
419.4 000D2D link SET $
419.5 000D2D 06 DB 6
419.6 000D2E 616363657074 DB 'accept'
419.7 000D34 EVEN
419.8 000D34 IF 'DOCOLON'='DOCODE'
419.9 000D34 ACCEPT: DW $+2
419.10 000D34 ELSE
419.11 000D34 .... ACCEPT: DW DOCOLON
419.12 000D36 ENDIF
419.13 000D36 ENDM
420 000D36 ............* DW OVER,PLUS,ONEMINUS,OVER
421 000D3E ACC1: ; DW KEY,DUP,lit,0DH,NOTEQUAL,qbran
422 000D3E .... DW KEY
423 000D40 ........0D00* DW DUP,lit,0DH,NOTEQUAL ; ( -- c f )
CR
424 000D48 ; DW OVER,lit,0AH,NOTEQUAL ; ( -- c f f )
LF
425 000D48 ; DW ANDD
426 000D48 .... DW qbran
427 000D4A DEST ACC5
427.1 000D4A 3800 DW ACC5-$
427.2 000D4C ENDM
428 000D4C ........ DW DUP,EMIT
429 000D50 ; DW DUP,STORELEDS ; testing
430 000D50 ........0800* DW DUP,lit,8,EQUAL,qbran ;mk BS
received?
431 000D5A DEST ACC3
431.1 000D5A 1A00 DW ACC3-$
431.2 000D5C ENDM
432 000D5C ............* DW DROP,ONEMINUS,TOR,OVER,RFROM,UMAX ;mk
backspace handling
433 000D68 ........0800* DW SPACE,lit,8,EMIT ;mk $08 == BS (for
tera term and
hyterterminal)
434 000D70 .... DW bran
435 000D72 DEST ACC4
435.1 000D72 0C00 DW ACC4-$
435.2 000D74 ENDM
436 000D74 ............*ACC3: DW OVER,CSTORE,ONEPLUS,OVER,UMIN
437 000D7E .... ACC4: DW bran
438 000D80 DEST ACC1
438.1 000D80 BEFF DW ACC1-$
438.2 000D82 ENDM
439 000D82 ............*ACC5: DW DROP,NIP,SWAP,MINUS,EXIT
440 000D8C
441 000D8C ;C TYPE c-addr +n -- type line to
term'l
442 000D8C ; ?DUP IF
443 000D8C ; OVER + SWAP DO I C@ EMIT LOOP
444 000D8C ; ELSE DROP THEN ;
445 000D8C HEADER TYP,4,'type',DOCOLON
445.1 000000 PUBLIC TYP
445.2 000D8C .... DW link
445.3 000D8E FF DB 0FFh ; not immediate
445.4 000D8F link SET $
445.5 000D8F 04 DB 4
445.6 000D90 74797065 DB 'type'
445.7 000D94 EVEN
445.8 000D94 IF 'DOCOLON'='DOCODE'
445.9 000D94 TYP: DW $+2
445.10 000D94 ELSE
445.11 000D94 .... TYP: DW DOCOLON
445.12 000D96 ENDIF
445.13 000D96 ENDM
446 000D96 ........ DW QDUP,qbran
447 000D9A DEST TYP4
447.1 000D9A 1800 DW TYP4-$
447.2 000D9C ENDM
448 000D9C ............* DW OVER,PLUS,SWAP,xdo
449 000DA4 ............*TYP3: DW II,CFETCH,EMIT,xloop
450 000DAC DEST TYP3
450.1 000DAC F8FF DW TYP3-$
450.2 000DAE ENDM
451 000DAE .... DW bran
452 000DB0 DEST TYP5
452.1 000DB0 0400 DW TYP5-$
452.2 000DB2 ENDM
453 000DB2 .... TYP4: DW DROP
454 000DB4 .... TYP5: DW EXIT
455 000DB6
456 000DB6
457 000DB6 ; HARVARD MODEL EXTENSIONS (split Code &
Data)
458 000DB6
459 000DB6 ;Z ICOUNT c-addr1 -- c-addr2 u counted->adr/le
n
460 000DB6 ; DUP CHAR+ SWAP IC@ ; from Code
space
461 000DB6 HEADER ICOUNT,6,'icount',DOCOLON
461.1 000000 PUBLIC ICOUNT
461.2 000DB6 .... DW link
461.3 000DB8 FF DB 0FFh ; not immediate
461.4 000DB9 link SET $
461.5 000DB9 06 DB 6
461.6 000DBA 69636F756E74 DB 'icount'
461.7 000DC0 EVEN
461.8 000DC0 IF 'DOCOLON'='DOCODE'
461.9 000DC0 ICOUNT: DW $+2
461.10 000DC0 ELSE
461.11 000DC0 .... ICOUNT: DW DOCOLON
461.12 000DC2 ENDIF
461.13 000DC2 ENDM
462 000DC2 ............* DW DUP,CHARPLUS,SWAP,ICFETCH,EXIT
463 000DCC
464 000DCC ;Z ITYPE c-addr +n -- type line to
term'l
465 000DCC ; ?DUP IF from Code
space
466 000DCC ; OVER + SWAP DO I IC@ EMIT LOOP
467 000DCC ; ELSE DROP THEN ;
468 000DCC HEADER ITYPE,5,'itype',DOCOLON
468.1 000000 PUBLIC ITYPE
468.2 000DCC .... DW link
468.3 000DCE FF DB 0FFh ; not immediate
468.4 000DCF link SET $
468.5 000DCF 05 DB 5
468.6 000DD0 6974797065 DB 'itype'
468.7 000DD5 00 EVEN
468.8 000DD6 IF 'DOCOLON'='DOCODE'
468.9 000DD6 ITYPE: DW $+2
468.10 000DD6 ELSE
468.11 000DD6 .... ITYPE: DW DOCOLON
468.12 000DD8 ENDIF
468.13 000DD8 ENDM
469 000DD8 ........ DW QDUP,qbran
470 000DDC DEST ITYP4
470.1 000DDC 1800 DW ITYP4-$
470.2 000DDE ENDM
471 000DDE ............* DW OVER,PLUS,SWAP,xdo
472 000DE6 ............*ITYP3: DW II,ICFETCH,EMIT,xloop
473 000DEE DEST ITYP3
473.1 000DEE F8FF DW ITYP3-$
473.2 000DF0 ENDM
474 000DF0 .... DW bran
475 000DF2 DEST ITYP5
475.1 000DF2 0400 DW ITYP5-$
475.2 000DF4 ENDM
476 000DF4 .... ITYP4: DW DROP
477 000DF6 .... ITYP5: DW EXIT
478 000DF8
479 000DF8 ;Z (IS") -- c-addr u run-time code for
S"
480 000DF8 ; R> ICOUNT 2DUP + ALIGNED >R ;
481 000DF8 ; Harvard model, for string stored in Code
space
482 000DF8 ; e.g. as used by ."
483 000DF8 HEADER XISQUOTE,5,'(is")',DOCOLON
483.1 000000 PUBLIC XISQUOTE
483.2 000DF8 .... DW link
483.3 000DFA FF DB 0FFh ; not immediate
483.4 000DFB link SET $
483.5 000DFB 05 DB 5
483.6 000DFC 2869732229 DB '(is")'
483.7 000E01 00 EVEN
483.8 000E02 IF 'DOCOLON'='DOCODE'
483.9 000E02 XISQUOTE: DW $+2
483.10 000E02 ELSE
483.11 000E02 .... XISQUOTE: DW DOCOLON
483.12 000E04 ENDIF
483.13 000E04 ENDM
484 000E04 ............* DW RFROM,ICOUNT,TWODUP,PLUS,ALIGNED,TOR
485 000E10 .... DW EXIT
486 000E12
487 000E12 ;Z (S") -- c-addr u run-time code for
S"
488 000E12 ; R@ I@ get Data
address
489 000E12 ; R> CELL+ DUP IC@ CHAR+ -- Dadr Radr+2
n+1
490 000E12 ; 2DUP + ALIGNED >R -- Dadr Iadr
n+1
491 000E12 ; >R OVER R> I->D -- Dadr
492 000E12 ; COUNT ;
493 000E12 ; Harvard model, for string stored in Code
space
494 000E12 ; which is copied to Data space.
495 000E12 HEADER XSQUOTE,4,'(s")',DOCOLON
495.1 000000 PUBLIC XSQUOTE
495.2 000E12 .... DW link
495.3 000E14 FF DB 0FFh ; not immediate
495.4 000E15 link SET $
495.5 000E15 04 DB 4
495.6 000E16 28732229 DB '(s")'
495.7 000E1A EVEN
495.8 000E1A IF 'DOCOLON'='DOCODE'
495.9 000E1A XSQUOTE: DW $+2
495.10 000E1A ELSE
495.11 000E1A .... XSQUOTE: DW DOCOLON
495.12 000E1C ENDIF
495.13 000E1C ENDM
496 000E1C ........ DW RFETCH,IFETCH
497 000E20 ............* DW RFROM,CELLPLUS,DUP,ICFETCH,CHARPLUS
498 000E2A ............* DW TWODUP,PLUS,ALIGNED,TOR
499 000E32 ............* DW TOR,OVER,RFROM,ITOD,COUNT,EXIT
500 000E3E
501 000E3E ;C IS" -- compile in-line
string
502 000E3E ; COMPILE (IS") [ HEX ]
503 000E3E ; 22 IWORD
504 000E3E ; IC@ 1+ ALIGNED IALLOT ; IMMEDIATE
505 000E3E ; Harvard model: string is stored in Code
space
506 000E3E IMMED ISQUOTE,3,'is"',DOCOLON
506.1 000000 PUBLIC ISQUOTE
506.2 000E3E .... DW link
506.3 000E40 FE DB 0FEh // ; immediate
(LSB=0)
506.4 000E41 link SET $
506.5 000E41 03 DB 3
506.6 000E42 697322 DB 'is"'
506.7 000E45 00 EVEN
506.8 000E46 IF 'DOCOLON'='DOCODE'
506.9 000E46 ISQUOTE: DW $+2
506.10 000E46 ELSE
506.11 000E46 .... ISQUOTE: DW DOCOLON
506.12 000E48 ENDIF
506.13 000E48 ENDM
507 000E48 ............ DW lit,XISQUOTE,COMMAXT
508 000E4E ....2200.... DW lit,22H,IWORD
509 000E54 ............* DW ICFETCH,ONEPLUS,ALIGNED,IALLOT,EXIT
510 000E5E
511 000E5E ;C S" -- compile in-line
string
512 000E5E ; COMPILE (S") [ HEX ]
513 000E5E ; HERE I, data address
514 000E5E ; 22 IWORD
515 000E5E ; IC@ 1+ ALIGNED
516 000E5E ; DUP ALLOT IALLOT ; IMMEDIATE
517 000E5E ; Harvard model: string is stored in Code
space
518 000E5E IMMED SQUOTE,2,'s"',DOCOLON
518.1 000000 PUBLIC SQUOTE
518.2 000E5E .... DW link
518.3 000E60 FE DB 0FEh // ; immediate
(LSB=0)
518.4 000E61 link SET $
518.5 000E61 02 DB 2
518.6 000E62 7322 DB 's"'
518.7 000E64 EVEN
518.8 000E64 IF 'DOCOLON'='DOCODE'
518.9 000E64 SQUOTE: DW $+2
518.10 000E64 ELSE
518.11 000E64 .... SQUOTE: DW DOCOLON
518.12 000E66 ENDIF
518.13 000E66 ENDM
519 000E66 ............ DW lit,XSQUOTE,COMMAXT
520 000E6C ............* DW HERE,ICOMMA,lit,22H,IWORD
521 000E76 ............ DW ICFETCH,ONEPLUS,ALIGNED
522 000E7C ............* DW DUP,ALLOT,IALLOT,EXIT
523 000E84
524 000E84 ;C ." -- compile string to
print
525 000E84 ; POSTPONE IS" POSTPONE ITYPE ; IMMEDIATE
526 000E84 IMMED DOTQUOTE,2,'."',DOCOLON
526.1 000000 PUBLIC DOTQUOTE
526.2 000E84 .... DW link
526.3 000E86 FE DB 0FEh // ; immediate
(LSB=0)
526.4 000E87 link SET $
526.5 000E87 02 DB 2
526.6 000E88 2E22 DB '."'
526.7 000E8A EVEN
526.8 000E8A IF 'DOCOLON'='DOCODE'
526.9 000E8A DOTQUOTE: DW $+2
526.10 000E8A ELSE
526.11 000E8A .... DOTQUOTE: DW DOCOLON
526.12 000E8C ENDIF
526.13 000E8C ENDM
527 000E8C .... DW ISQUOTE
528 000E8E ............ DW lit,ITYPE,COMMAXT
529 000E94 .... DW EXIT
530 000E96
531 000E96 ;Z IWORD c -- c-addr WORD to Code
space
532 000E96 ; WORD
533 000E96 ; IHERE TUCK OVER C@ CHAR+ D->I ;
534 000E96 HEADER IWORD,5,'iword',DOCOLON
534.1 000000 PUBLIC IWORD
534.2 000E96 .... DW link
534.3 000E98 FF DB 0FFh ; not immediate
534.4 000E99 link SET $
534.5 000E99 05 DB 5
534.6 000E9A 69776F7264 DB 'iword'
534.7 000E9F 00 EVEN
534.8 000EA0 IF 'DOCOLON'='DOCODE'
534.9 000EA0 IWORD: DW $+2
534.10 000EA0 ELSE
534.11 000EA0 .... IWORD: DW DOCOLON
534.12 000EA2 ENDIF
534.13 000EA2 ENDM
535 000EA2 .... DW WORDD
536 000EA4 ............*IWORD1: DW IHERE,TUCK,OVER,CFETCH
537 000EAC ............ DW CHARPLUS,DTOI,EXIT
538 000EB2
539 000EB2 ;Z IWORDC c -- c-addr maybe capitalize
WORD to Code space
540 000EB2 ; WORD CAPITALIZE
541 000EB2 ; IHERE TUCK OVER C@ CHAR+ D->I ;
542 000EB2 ; HEADER IWORDC,6,'IWORDC',DOCOLON
543 000EB2 HEADLESS IWORDC, DOCOLON
543.1 000000 PUBLIC IWORDC
543.2 000EB2 IF 'DOCOLON'='DOCODE'
543.3 000EB2 IWORDC: DW $+2
543.4 000EB2 ELSE
543.5 000EB2 .... IWORDC: DW DOCOLON
543.6 000EB4 ENDIF
543.7 000EB4 ENDM
544 000EB4 ........ DW WORDD, CAPITALIZE
545 000EB8 .... DW bran
546 000EBA DEST IWORD1
546.1 000EBA EAFF DW IWORD1-$
546.2 000EBC ENDM
547 000EBC
548 000EBC ; SEPARATE HEADER EXTENSIONS ARE NOT USED
549 000EBC #define HCOUNT ICOUNT
550 000EBC #define HTYPE ITYPE
551 000EBC #define HWORD IWORDC
552 000EBC
553 000EBC ; NUMERIC OUTPUT ===============================
=
554 000EBC ; Numeric conversion is done l.s.digit first,
so
555 000EBC ; the output buffer is built backwards in
memory.
556 000EBC
557 000EBC ; Some double-precision arithmetic operators
are
558 000EBC ; needed to implement ANSI numeric conversion.
559 000EBC
560 000EBC ;Z UD/MOD ud1 u2 -- u3 ud4 32/16->32
divide
561 000EBC ; >R 0 R@ UM/MOD ROT ROT R> UM/MOD ROT
;
562 000EBC HEADER UDSLASHMOD,6,'ud/mod',DOCOLON
562.1 000000 PUBLIC UDSLASHMOD
562.2 000EBC .... DW link
562.3 000EBE FF DB 0FFh ; not immediate
562.4 000EBF link SET $
562.5 000EBF 06 DB 6
562.6 000EC0 75642F6D6F64 DB 'ud/mod'
562.7 000EC6 EVEN
562.8 000EC6 IF 'DOCOLON'='DOCODE'
562.9 000EC6 UDSLASHMOD: DW $+2
562.10 000EC6 ELSE
562.11 000EC6 .... UDSLASHMOD: DW DOCOLON
562.12 000EC8 ENDIF
562.13 000EC8 ENDM
563 000EC8 ........0000* DW TOR,lit,0,RFETCH,UMSLASHMOD,ROT,ROT
564 000ED6 ............* DW RFROM,UMSLASHMOD,ROT,EXIT
565 000EDE
566 000EDE ;Z UD* ud1 d2 -- ud3 32*16->32
multiply
567 000EDE ; DUP >R UM* DROP SWAP R> UM* ROT +
;
568 000EDE HEADER UDSTAR,3,'ud*',DOCOLON
568.1 000000 PUBLIC UDSTAR
568.2 000EDE .... DW link
568.3 000EE0 FF DB 0FFh ; not immediate
568.4 000EE1 link SET $
568.5 000EE1 03 DB 3
568.6 000EE2 75642A DB 'ud*'
568.7 000EE5 00 EVEN
568.8 000EE6 IF 'DOCOLON'='DOCODE'
568.9 000EE6 UDSTAR: DW $+2
568.10 000EE6 ELSE
568.11 000EE6 .... UDSTAR: DW DOCOLON
568.12 000EE8 ENDIF
568.13 000EE8 ENDM
569 000EE8 ............* DW DUP,TOR,UMSTAR,DROP
570 000EF0 ............* DW SWAP,RFROM,UMSTAR,ROT,PLUS,EXIT
571 000EFC
572 000EFC ;C HOLD char -- add char to output
string
573 000EFC ; -1 HP +! HP @ C! ;
574 000EFC HEADER HOLD,4,'hold',DOCOLON
574.1 000000 PUBLIC HOLD
574.2 000EFC .... DW link
574.3 000EFE FF DB 0FFh ; not immediate
574.4 000EFF link SET $
574.5 000EFF 04 DB 4
574.6 000F00 686F6C64 DB 'hold'
574.7 000F04 EVEN
574.8 000F04 IF 'DOCOLON'='DOCODE'
574.9 000F04 HOLD: DW $+2
574.10 000F04 ELSE
574.11 000F04 .... HOLD: DW DOCOLON
574.12 000F06 ENDIF
574.13 000F06 ENDM
575 000F06 ....FFFF....* DW lit,-1,HP,PLUSSTORE
576 000F0E ............* DW HP,FETCH,CSTORE,EXIT
577 000F16
578 000F16 ;C <# -- begin numeric conversion
579 000F16 ; PAD HP ! ; (initialize Hold
Pointer)
580 000F16 HEADER LESSNUM,2,'<#',DOCOLON
580.1 000000 PUBLIC LESSNUM
580.2 000F16 .... DW link
580.3 000F18 FF DB 0FFh ; not immediate
580.4 000F19 link SET $
580.5 000F19 02 DB 2
580.6 000F1A 3C23 DB '<#'
580.7 000F1C EVEN
580.8 000F1C IF 'DOCOLON'='DOCODE'
580.9 000F1C LESSNUM: DW $+2
580.10 000F1C ELSE
580.11 000F1C .... LESSNUM: DW DOCOLON
580.12 000F1E ENDIF
580.13 000F1E ENDM
581 000F1E ............* DW PAD,HP,STORE,EXIT
582 000F26
583 000F26 ;Z >digit n -- c convert to 0..9A..Z
584 000F26 ; [ HEX ] DUP 9 > 7 AND + 30 + ;
585 000F26 HEADER TODIGIT,6,'>digit',DOCOLON
585.1 000000 PUBLIC TODIGIT
585.2 000F26 .... DW link
585.3 000F28 FF DB 0FFh ; not immediate
585.4 000F29 link SET $
585.5 000F29 06 DB 6
585.6 000F2A 3E6469676974 DB '>digit'
585.7 000F30 EVEN
585.8 000F30 IF 'DOCOLON'='DOCODE'
585.9 000F30 TODIGIT: DW $+2
585.10 000F30 ELSE
585.11 000F30 .... TODIGIT: DW DOCOLON
585.12 000F32 ENDIF
585.13 000F32 ENDM
586 000F32 ........0900* DW DUP,lit,9,GREATER,lit,7,ANDD,PLUS
587 000F42 ....3000....* DW lit,30H,PLUS,EXIT
588 000F4A
589 000F4A ;C # ud1 -- ud2 convert 1 digit of
output
590 000F4A ; BASE @ UD/MOD ROT >digit HOLD ;
591 000F4A HEADER NUM,1,'#',DOCOLON
591.1 000000 PUBLIC NUM
591.2 000F4A .... DW link
591.3 000F4C FF DB 0FFh ; not immediate
591.4 000F4D link SET $
591.5 000F4D 01 DB 1
591.6 000F4E 23 DB '#'
591.7 000F4F 00 EVEN
591.8 000F50 IF 'DOCOLON'='DOCODE'
591.9 000F50 NUM: DW $+2
591.10 000F50 ELSE
591.11 000F50 .... NUM: DW DOCOLON
591.12 000F52 ENDIF
591.13 000F52 ENDM
592 000F52 ............* DW BASE,FETCH,UDSLASHMOD,ROT,TODIGIT
593 000F5C ........ DW HOLD,EXIT
594 000F60
595 000F60 ;C #S ud1 -- ud2 convert remaining
digits
596 000F60 ; BEGIN # 2DUP OR 0= UNTIL ;
597 000F60 HEADER NUMS,2,'#s',DOCOLON
597.1 000000 PUBLIC NUMS
597.2 000F60 .... DW link
597.3 000F62 FF DB 0FFh ; not immediate
597.4 000F63 link SET $
597.5 000F63 02 DB 2
597.6 000F64 2373 DB '#s'
597.7 000F66 EVEN
597.8 000F66 IF 'DOCOLON'='DOCODE'
597.9 000F66 NUMS: DW $+2
597.10 000F66 ELSE
597.11 000F66 .... NUMS: DW DOCOLON
597.12 000F68 ENDIF
597.13 000F68 ENDM
598 000F68 ............*NUMS1: DW NUM,TWODUP,ORR,ZEROEQUAL,qbran
599 000F72 DEST NUMS1
599.1 000F72 F6FF DW NUMS1-$
599.2 000F74 ENDM
600 000F74 .... DW EXIT
601 000F76
602 000F76 ;C #> ud1 -- c-addr u end conv., get
string
603 000F76 ; 2DROP HP @ PAD OVER - ;
604 000F76 HEADER NUMGREATER,2,'#>',DOCOLON
604.1 000000 PUBLIC NUMGREATER
604.2 000F76 .... DW link
604.3 000F78 FF DB 0FFh ; not immediate
604.4 000F79 link SET $
604.5 000F79 02 DB 2
604.6 000F7A 233E DB '#>'
604.7 000F7C EVEN
604.8 000F7C IF 'DOCOLON'='DOCODE'
604.9 000F7C NUMGREATER: DW $+2
604.10 000F7C ELSE
604.11 000F7C .... NUMGREATER: DW DOCOLON
604.12 000F7E ENDIF
604.13 000F7E ENDM
605 000F7E ............* DW TWODROP,HP,FETCH,PAD,OVER,MINUS,EXIT
606 000F8C
607 000F8C ;C SIGN n -- add minus sign if
n<0
608 000F8C ; 0< IF 2D HOLD THEN ;
609 000F8C HEADER SIGN,4,'sign',DOCOLON
609.1 000000 PUBLIC SIGN
609.2 000F8C .... DW link
609.3 000F8E FF DB 0FFh ; not immediate
609.4 000F8F link SET $
609.5 000F8F 04 DB 4
609.6 000F90 7369676E DB 'sign'
609.7 000F94 EVEN
609.8 000F94 IF 'DOCOLON'='DOCODE'
609.9 000F94 SIGN: DW $+2
609.10 000F94 ELSE
609.11 000F94 .... SIGN: DW DOCOLON
609.12 000F96 ENDIF
609.13 000F96 ENDM
610 000F96 ........ DW ZEROLESS,qbran
611 000F9A DEST SIGN1
611.1 000F9A 0800 DW SIGN1-$
611.2 000F9C ENDM
612 000F9C ....2D00.... DW lit,2DH,HOLD
613 000FA2 .... SIGN1: DW EXIT
614 000FA4
615 000FA4 ;C U. u -- display u unsigned
616 000FA4 ; <# 0 #S #> TYPE SPACE ;
617 000FA4 HEADER UDOT,2,'u.',DOCOLON
617.1 000000 PUBLIC UDOT
617.2 000FA4 .... DW link
617.3 000FA6 FF DB 0FFh ; not immediate
617.4 000FA7 link SET $
617.5 000FA7 02 DB 2
617.6 000FA8 752E DB 'u.'
617.7 000FAA EVEN
617.8 000FAA IF 'DOCOLON'='DOCODE'
617.9 000FAA UDOT: DW $+2
617.10 000FAA ELSE
617.11 000FAA .... UDOT: DW DOCOLON
617.12 000FAC ENDIF
617.13 000FAC ENDM
618 000FAC ........0000* DW LESSNUM,lit,0,NUMS,NUMGREATER,TYP
619 000FB8 ........ DW SPACE,EXIT
620 000FBC
621 000FBC ;C . n -- display n signed
622 000FBC ; <# DUP ABS 0 #S ROT SIGN #> TYPE SPACE
;
623 000FBC HEADER DOT,1,'.',DOCOLON
623.1 000000 PUBLIC DOT
623.2 000FBC .... DW link
623.3 000FBE FF DB 0FFh ; not immediate
623.4 000FBF link SET $
623.5 000FBF 01 DB 1
623.6 000FC0 2E DB '.'
623.7 000FC1 00 EVEN
623.8 000FC2 IF 'DOCOLON'='DOCODE'
623.9 000FC2 DOT: DW $+2
623.10 000FC2 ELSE
623.11 000FC2 .... DOT: DW DOCOLON
623.12 000FC4 ENDIF
623.13 000FC4 ENDM
624 000FC4 ............* DW LESSNUM,DUP,ABBS,lit,0,NUMS
625 000FD0 ............* DW ROT,SIGN,NUMGREATER,TYP,SPACE,EXIT
626 000FDC
627 000FDC ;C DECIMAL -- set number base to
decimal
628 000FDC ; 10 BASE ! ;
629 000FDC HEADER DECIMAL,7,'decimal',DOCOLON
629.1 000000 PUBLIC DECIMAL
629.2 000FDC .... DW link
629.3 000FDE FF DB 0FFh ; not immediate
629.4 000FDF link SET $
629.5 000FDF 07 DB 7
629.6 000FE0 646563696D61* DB 'decimal'
629.7 000FE7 00 EVEN
629.8 000FE8 IF 'DOCOLON'='DOCODE'
629.9 000FE8 DECIMAL: DW $+2
629.10 000FE8 ELSE
629.11 000FE8 .... DECIMAL: DW DOCOLON
629.12 000FEA ENDIF
629.13 000FEA ENDM
630 000FEA ....0A00....* DW lit,10,BASE,STORE,EXIT
631 000FF4
632 000FF4 ;X HEX -- set number base to
hex
633 000FF4 ; 16 BASE ! ;
634 000FF4 HEADER HEX,3,'hex',DOCOLON
634.1 000000 PUBLIC HEX
634.2 000FF4 .... DW link
634.3 000FF6 FF DB 0FFh ; not immediate
634.4 000FF7 link SET $
634.5 000FF7 03 DB 3
634.6 000FF8 686578 DB 'hex'
634.7 000FFB 00 EVEN
634.8 000FFC IF 'DOCOLON'='DOCODE'
634.9 000FFC HEX: DW $+2
634.10 000FFC ELSE
634.11 000FFC .... HEX: DW DOCOLON
634.12 000FFE ENDIF
634.13 000FFE ENDM
635 000FFE ....1000....* DW lit,16,BASE,STORE,EXIT
636 001008
637 001008 ; DICTIONARY MANAGEMENT ========================
=
638 001008
639 001008 ;C HERE -- addr returns dictionary
ptr
640 001008 ; DP @ ;
641 001008 HEADER HERE,4,'here',DOCOLON
641.1 000000 PUBLIC HERE
641.2 001008 .... DW link
641.3 00100A FF DB 0FFh ; not immediate
641.4 00100B link SET $
641.5 00100B 04 DB 4
641.6 00100C 68657265 DB 'here'
641.7 001010 EVEN
641.8 001010 IF 'DOCOLON'='DOCODE'
641.9 001010 HERE: DW $+2
641.10 001010 ELSE
641.11 001010 .... HERE: DW DOCOLON
641.12 001012 ENDIF
641.13 001012 ENDM
642 001012 ............ DW DDP,FETCH,EXIT
643 001018
644 001018 ;C ALLOT n -- allocate n bytes in
dict
645 001018 ; DP +! ;
646 001018 HEADER ALLOT,5,'allot',DOCOLON
646.1 000000 PUBLIC ALLOT
646.2 001018 .... DW link
646.3 00101A FF DB 0FFh ; not immediate
646.4 00101B link SET $
646.5 00101B 05 DB 5
646.6 00101C 616C6C6F74 DB 'allot'
646.7 001021 00 EVEN
646.8 001022 IF 'DOCOLON'='DOCODE'
646.9 001022 ALLOT: DW $+2
646.10 001022 ELSE
646.11 001022 .... ALLOT: DW DOCOLON
646.12 001024 ENDIF
646.13 001024 ENDM
647 001024 ............ DW DDP,PLUSSTORE,EXIT
648 00102A
649 00102A ;C , x -- append cell to dict
650 00102A ; HERE ! 1 CELLS ALLOT ;
651 00102A HEADER COMMA,1,',',DOCOLON
651.1 000000 PUBLIC COMMA
651.2 00102A .... DW link
651.3 00102C FF DB 0FFh ; not immediate
651.4 00102D link SET $
651.5 00102D 01 DB 1
651.6 00102E 2C DB ','
651.7 00102F 00 EVEN
651.8 001030 IF 'DOCOLON'='DOCODE'
651.9 001030 COMMA: DW $+2
651.10 001030 ELSE
651.11 001030 .... COMMA: DW DOCOLON
651.12 001032 ENDIF
651.13 001032 ENDM
652 001032 ............* DW HERE,STORE,lit,1,CELLS,ALLOT,EXIT
653 001040
654 001040 ;C C, char -- append char to dict
655 001040 ; HERE C! 1 CHARS ALLOT ;
656 001040 HEADER CCOMMA,2,'c,',DOCOLON
656.1 000000 PUBLIC CCOMMA
656.2 001040 .... DW link
656.3 001042 FF DB 0FFh ; not immediate
656.4 001043 link SET $
656.5 001043 02 DB 2
656.6 001044 632C DB 'c,'
656.7 001046 EVEN
656.8 001046 IF 'DOCOLON'='DOCODE'
656.9 001046 CCOMMA: DW $+2
656.10 001046 ELSE
656.11 001046 .... CCOMMA: DW DOCOLON
656.12 001048 ENDIF
656.13 001048 ENDM
657 001048 ............* DW HERE,CSTORE,lit,1,CHARS,ALLOT,EXIT
658 001056
659 001056 ; The following additional words support
the
660 001056 ; "Harvard" model, with separate address
spaces
661 001056 ; for Instructions (Code) and Data. ANSI
662 001056 ; requires DP to manage the Data space, so
a
663 001056 ; separate Instruction Dictionary Pointer,
IDP,
664 001056 ; is added to manage the Code space. Also
added:
665 001056 ; I@ IC@ I! IC! I->D D->I (in the primitives
)
666 001056 ; ITYPE ICOUNT IWORD (above)
667 001056 ; IHERE IALLOT I, IC, (below)
668 001056 ; It should be possible to convert the
Harvard
669 001056 ; implementation to a combined-code-and-data
670 001056 ; system, by equating these words to their
671 001056 ; Data-space counterparts.
672 001056
673 001056 ;C IHERE -- addr returns Code dictionary
ptr
674 001056 ; IDP @ ;
675 001056 HEADER IHERE,5,'ihere',DOCOLON
675.1 000000 PUBLIC IHERE
675.2 001056 .... DW link
675.3 001058 FF DB 0FFh ; not immediate
675.4 001059 link SET $
675.5 001059 05 DB 5
675.6 00105A 6968657265 DB 'ihere'
675.7 00105F 00 EVEN
675.8 001060 IF 'DOCOLON'='DOCODE'
675.9 001060 IHERE: DW $+2
675.10 001060 ELSE
675.11 001060 .... IHERE: DW DOCOLON
675.12 001062 ENDIF
675.13 001062 ENDM
676 001062 ............ DW IDP,FETCH,EXIT
677 001068
678 001068 ;C IALLOT n -- allocate n bytes in Code
dict
679 001068 ; IDP +! ;
680 001068 HEADER IALLOT,6,'iallot',DOCOLON
680.1 000000 PUBLIC IALLOT
680.2 001068 .... DW link
680.3 00106A FF DB 0FFh ; not immediate
680.4 00106B link SET $
680.5 00106B 06 DB 6
680.6 00106C 69616C6C6F74 DB 'iallot'
680.7 001072 EVEN
680.8 001072 IF 'DOCOLON'='DOCODE'
680.9 001072 IALLOT: DW $+2
680.10 001072 ELSE
680.11 001072 .... IALLOT: DW DOCOLON
680.12 001074 ENDIF
680.13 001074 ENDM
681 001074 ............ DW IDP,PLUSSTORE,EXIT
682 00107A
683 00107A ;C I, x -- append cell to Code
dict
684 00107A ; IHERE I! 1 CELLS IALLOT ;
685 00107A HEADER ICOMMA,2,'i,',DOCOLON
685.1 000000 PUBLIC ICOMMA
685.2 00107A .... DW link
685.3 00107C FF DB 0FFh ; not immediate
685.4 00107D link SET $
685.5 00107D 02 DB 2
685.6 00107E 692C DB 'i,'
685.7 001080 EVEN
685.8 001080 IF 'DOCOLON'='DOCODE'
685.9 001080 ICOMMA: DW $+2
685.10 001080 ELSE
685.11 001080 .... ICOMMA: DW DOCOLON
685.12 001082 ENDIF
685.13 001082 ENDM
686 001082 ............* DW IHERE,ISTORE,lit,1,CELLS,IALLOT,EXIT
687 001090
688 001090 ;C IC, char -- append char to Code
dict
689 001090 ; IHERE IC! 1 CHARS IALLOT ;
690 001090 HEADER ICCOMMA,3,'ic,',DOCOLON
690.1 000000 PUBLIC ICCOMMA
690.2 001090 .... DW link
690.3 001092 FF DB 0FFh ; not immediate
690.4 001093 link SET $
690.5 001093 03 DB 3
690.6 001094 69632C DB 'ic,'
690.7 001097 00 EVEN
690.8 001098 IF 'DOCOLON'='DOCODE'
690.9 001098 ICCOMMA: DW $+2
690.10 001098 ELSE
690.11 001098 .... ICCOMMA: DW DOCOLON
690.12 00109A ENDIF
690.13 00109A ENDM
691 00109A ............* DW IHERE,ICSTORE,lit,1,CHARS,IALLOT,EXIT
692 0010A8
693 0010A8 ; SEPARATE HEADER EXTENSIONS ARE NOT USED
694 0010A8 #define HHERE IHERE
695 0010A8 #define HALLOT IALLOT
696 0010A8 #define HCOMMA ICOMMA
697 0010A8 #define HCCOMMA ICCOMMA
698 0010A8 #define HCFETCH ICFETCH
699 0010A8 #define HFETCH IFETCH
700 0010A8 #define HCSTORE ICSTORE
701 0010A8 #define HSTORE ISTORE
702 0010A8
703 0010A8 ; INTERPRETER ==================================
=
704 0010A8 ; Note that NFA>LFA, NFA>CFA, IMMED?, and
FIND
705 0010A8 ; are dependent on the structure of the
Forth
706 0010A8 ; header. This may be common across many
CPUs,
707 0010A8 ; or it may be different.
708 0010A8
709 0010A8 ;C SOURCE -- adr n current input buffer
710 0010A8 ; 'SOURCE 2@ ; length is at lower
adrs
711 0010A8 HEADER SOURCE,6,'source',DOCOLON
711.1 000000 PUBLIC SOURCE
711.2 0010A8 .... DW link
711.3 0010AA FF DB 0FFh ; not immediate
711.4 0010AB link SET $
711.5 0010AB 06 DB 6
711.6 0010AC 736F75726365 DB 'source'
711.7 0010B2 EVEN
711.8 0010B2 IF 'DOCOLON'='DOCODE'
711.9 0010B2 SOURCE: DW $+2
711.10 0010B2 ELSE
711.11 0010B2 .... SOURCE: DW DOCOLON
711.12 0010B4 ENDIF
711.13 0010B4 ENDM
712 0010B4 ............ DW TICKSOURCE,TWOFETCH,EXIT
713 0010BA
714 0010BA ;X /STRING a u n -- a+n u-n trim string
715 0010BA ; ROT OVER + ROT ROT - ;
716 0010BA HEADER SLASHSTRING,7,'/string',DOCOLON
716.1 000000 PUBLIC SLASHSTRING
716.2 0010BA .... DW link
716.3 0010BC FF DB 0FFh ; not immediate
716.4 0010BD link SET $
716.5 0010BD 07 DB 7
716.6 0010BE 2F737472696E* DB '/string'
716.7 0010C5 00 EVEN
716.8 0010C6 IF 'DOCOLON'='DOCODE'
716.9 0010C6 SLASHSTRING: DW $+2
716.10 0010C6 ELSE
716.11 0010C6 .... SLASHSTRING: DW DOCOLON
716.12 0010C8 ENDIF
716.13 0010C8 ENDM
717 0010C8 ............* DW ROT,OVER,PLUS,ROT,ROT,MINUS,EXIT
718 0010D6
719 0010D6 ;Z >counted src n dst -- copy to counted
str
720 0010D6 ; 2DUP C! CHAR+ SWAP CMOVE ;
721 0010D6 HEADER TOCOUNTED,8,'>counted',DOCOLON
721.1 000000 PUBLIC TOCOUNTED
721.2 0010D6 .... DW link
721.3 0010D8 FF DB 0FFh ; not immediate
721.4 0010D9 link SET $
721.5 0010D9 08 DB 8
721.6 0010DA 3E636F756E74* DB '>counted'
721.7 0010E2 EVEN
721.8 0010E2 IF 'DOCOLON'='DOCODE'
721.9 0010E2 TOCOUNTED: DW $+2
721.10 0010E2 ELSE
721.11 0010E2 .... TOCOUNTED: DW DOCOLON
721.12 0010E4 ENDIF
721.13 0010E4 ENDM
722 0010E4 ............* DW TWODUP,CSTORE,CHARPLUS,SWAP,CMOVE,EXI
T
723 0010F0
724 0010F0 ;C WORD char -- c-addr n word delim'd by
char
725 0010F0 ; DUP SOURCE >IN @ /STRING -- c c adr
n
726 0010F0 ; DUP >R ROT SKIP -- c adr'
n'
727 0010F0 ; OVER >R ROT SCAN -- adr"
n"
728 0010F0 ; DUP IF CHAR- THEN skip trailing
delim.
729 0010F0 ; R> R> ROT - >IN +! update >IN
offset
730 0010F0 ; TUCK - -- adr'
N
731 0010F0 ; HERE >counted --
732 0010F0 ; HERE -- a
733 0010F0 ; BL OVER COUNT + C! ; append trailing
blank
734 0010F0 HEADER WORDD,4,'word',DOCOLON
734.1 000000 PUBLIC WORDD
734.2 0010F0 .... DW link
734.3 0010F2 FF DB 0FFh ; not immediate
734.4 0010F3 link SET $
734.5 0010F3 04 DB 4
734.6 0010F4 776F7264 DB 'word'
734.7 0010F8 EVEN
734.8 0010F8 IF 'DOCOLON'='DOCODE'
734.9 0010F8 WORDD: DW $+2
734.10 0010F8 ELSE
734.11 0010F8 .... WORDD: DW DOCOLON
734.12 0010FA ENDIF
734.13 0010FA ENDM
735 0010FA ............* DW DUP,SOURCE,TOIN,FETCH,SLASHSTRING
736 001104 ............* DW DUP,TOR,ROT,SKIP
737 00110C ............* DW OVER,TOR,ROT,SCAN
738 001114 ........ DW DUP,qbran
739 001118 DEST WORD1
739.1 001118 0400 DW WORD1-$
739.2 00111A ENDM
740 00111A .... DW ONEMINUS ; char-
741 00111C ............*WORD1: DW RFROM,RFROM,ROT,MINUS,TOIN,PLUSSTORE
742 001128 ........ DW TUCK,MINUS
743 00112C ............ DW HERE,TOCOUNTED,HERE
744 001132 ............* DW BLANK,OVER,COUNT,PLUS,CSTORE,EXIT
745 00113E
746 00113E ;Z NFA>LFA nfa -- lfa name adr -> link
field
747 00113E ; 3 - ;
748 00113E HEADER NFATOLFA,7,'nfa>lfa',DOCOLON
748.1 000000 PUBLIC NFATOLFA
748.2 00113E .... DW link
748.3 001140 FF DB 0FFh ; not immediate
748.4 001141 link SET $
748.5 001141 07 DB 7
748.6 001142 6E66613E6C66* DB 'nfa>lfa'
748.7 001149 00 EVEN
748.8 00114A IF 'DOCOLON'='DOCODE'
748.9 00114A NFATOLFA: DW $+2
748.10 00114A ELSE
748.11 00114A .... NFATOLFA: DW DOCOLON
748.12 00114C ENDIF
748.13 00114C ENDM
749 00114C ....0300....* DW lit,3,MINUS,EXIT
750 001154
751 001154 ;Z NFA>CFA nfa -- cfa name adr -> code
field
752 001154 ; HCOUNT 7F AND + ALIGNED ; mask off
'smudge' bit
753 001154 HEADER NFATOCFA,7,'nfa>cfa',DOCOLON
753.1 000000 PUBLIC NFATOCFA
753.2 001154 .... DW link
753.3 001156 FF DB 0FFh ; not immediate
753.4 001157 link SET $
753.5 001157 07 DB 7
753.6 001158 6E66613E6366* DB 'nfa>cfa'
753.7 00115F 00 EVEN
753.8 001160 IF 'DOCOLON'='DOCODE'
753.9 001160 NFATOCFA: DW $+2
753.10 001160 ELSE
753.11 001160 .... NFATOCFA: DW DOCOLON
753.12 001162 ENDIF
753.13 001162 ENDM
754 001162 .... DW HCOUNT
755 001164 ....7F00....* DW lit,07FH,ANDD,PLUS,ALIGNED,EXIT
756 001170
757 001170 ;Z IMMED? nfa -- f fetch immediate
flag
758 001170 ; 1- HC@ 1 AND 0= ; Flashable model, LSB=0
if immed
759 001170 HEADER IMMEDQ,6,'immed?',DOCOLON
759.1 000000 PUBLIC IMMEDQ
759.2 001170 .... DW link
759.3 001172 FF DB 0FFh ; not immediate
759.4 001173 link SET $
759.5 001173 06 DB 6
759.6 001174 696D6D65643F DB 'immed?'
759.7 00117A EVEN
759.8 00117A IF 'DOCOLON'='DOCODE'
759.9 00117A IMMEDQ: DW $+2
759.10 00117A ELSE
759.11 00117A .... IMMEDQ: DW DOCOLON
759.12 00117C ENDIF
759.13 00117C ENDM
760 00117C ............* DW ONEMINUS,HCFETCH,lit,1,ANDD,ZEROEQUAL
,EXIT
761 00118A
762 00118A ;C FIND c-addr -- c-addr 0 if not found
763 00118A ;C xt 1 if immediate
764 00118A ;C xt -1 if "normal"
765 00118A ; LATEST @ BEGIN -- a nfa
766 00118A ; 2DUP OVER C@ CHAR+ -- a nfa a nfa
n+1
767 00118A ; N= -- a nfa
f
768 00118A ; DUP IF
769 00118A ; DROP
770 00118A ; NFA>LFA H@ DUP -- a link
link
771 00118A ; THEN
772 00118A ; 0= UNTIL -- a nfa OR a
0
773 00118A ; DUP IF
774 00118A ; NIP DUP NFA>CFA -- nfa xt
775 00118A ; SWAP IMMED? -- xt iflag
776 00118A ; 0= 1 OR -- xt 1/-1
777 00118A ; THEN ;
778 00118A HEADER FIND,4,'find',DOCOLON
778.1 000000 PUBLIC FIND
778.2 00118A .... DW link
778.3 00118C FF DB 0FFh ; not immediate
778.4 00118D link SET $
778.5 00118D 04 DB 4
778.6 00118E 66696E64 DB 'find'
778.7 001192 EVEN
778.8 001192 IF 'DOCOLON'='DOCODE'
778.9 001192 FIND: DW $+2
778.10 001192 ELSE
778.11 001192 .... FIND: DW DOCOLON
778.12 001194 ENDIF
778.13 001194 ENDM
779 001194 ........ DW LATEST,FETCH
780 001198 ............*FIND1: DW TWODUP,OVER,CFETCH,CHARPLUS
781 0011A0 ............ DW NEQUAL,DUP,qbran
782 0011A6 DEST FIND2
782.1 0011A6 0A00 DW FIND2-$
782.2 0011A8 ENDM
783 0011A8 ............* DW DROP,NFATOLFA,HFETCH,DUP
784 0011B0 ........ FIND2: DW ZEROEQUAL,qbran
785 0011B4 DEST FIND1
785.1 0011B4 E4FF DW FIND1-$
785.2 0011B6 ENDM
786 0011B6 ........ DW DUP,qbran
787 0011BA DEST FIND3
787.1 0011BA 1400 DW FIND3-$
787.2 0011BC ENDM
788 0011BC ............ DW NIP,DUP,NFATOCFA
789 0011C2 ............* DW SWAP,IMMEDQ,ZEROEQUAL,lit,1,ORR
790 0011CE .... FIND3: DW EXIT
791 0011D0
792 0011D0 /*
793 0011D0 ; use this if kernel words are upper case
794 0011D0 ;C UPC char -- char capitalize character
795 0011D0 ;
796 0011D0 ; DUP [CHAR] a < OVER [CHAR] z > OR IF EXIT THEN
797 0011D0 ; [ CHAR A CHAR a - ] LITERAL + ;
798 0011D0 ; HEADER UPC,3,'UPC',DOCOLON
799 0011D0 HEADLESS UPC, DOCOLON
800 0011D0 DW DUP, lit, 'a', LESS, OVER, lit, 'z',
GREATER
801 0011D0 DW ORR, qbran
802 0011D0 DEST UPC1
803 0011D0 DW EXIT
804 0011D0 UPC1: DW lit, 'A'-'a', PLUS
805 0011D0 DW EXIT
806 0011D0 */
807 0011D0
808 0011D0 ; use this if kernel words are lower case
809 0011D0 ;C UPC char -- char capitalize character
810 0011D0 ;
811 0011D0 ; DUP [CHAR] a < OVER [CHAR] z > OR IF EXIT THEN
812 0011D0 ; [ CHAR A CHAR a - ] LITERAL + ;
813 0011D0 ; HEADER UPC,3,'UPC',DOCOLON
814 0011D0 HEADLESS UPC, DOCOLON
814.1 000000 PUBLIC UPC
814.2 0011D0 IF 'DOCOLON'='DOCODE'
814.3 0011D0 UPC: DW $+2
814.4 0011D0 ELSE
814.5 0011D0 .... UPC: DW DOCOLON
814.6 0011D2 ENDIF
814.7 0011D2 ENDM
815 0011D2 ........4100* DW DUP, lit, 'A', LESS, OVER, lit, 'Z',
GREATER
816 0011E2 ........ DW ORR, qbran
817 0011E6 DEST UPC1
817.1 0011E6 0400 DW UPC1-$
817.2 0011E8 ENDM
818 0011E8 .... DW EXIT
819 0011EA ....E0FF.... UPC1: DW lit, 'A'-'a', MINUS
820 0011F0 .... DW EXIT
821 0011F2
822 0011F2
823 0011F2 ;C CAPITALIZE c-addr -- c-addr capitalize
string
824 0011F2 ;
825 0011F2 ; CAPS @ IF DUP COUNT OVER + SWAP ?DO I c@ upc
I c! LOOP THEN
826 0011F2 ; HEADER CAPITALIZE, 10, 'CAPITALIZE',
DOCOLON
827 0011F2 HEADLESS CAPITALIZE, DOCOLON
827.1 000000 PUBLIC CAPITALIZE
827.2 0011F2 IF 'DOCOLON'='DOCODE'
827.3 0011F2 CAPITALIZE: DW $+2
827.4 0011F2 ELSE
827.5 0011F2 .... CAPITALIZE: DW DOCOLON
827.6 0011F4 ENDIF
827.7 0011F4 ENDM
828 0011F4 ............ DW CAPS, FETCH, qbran
829 0011FA DEST CAPS2
829.1 0011FA 1C00 DW CAPS2-$
829.2 0011FC ENDM
830 0011FC ............* DW DUP, COUNT, OVER, PLUS, SWAP,
xdo
831 001208 ............*CAPS1: DW II, CFETCH, UPC, II, CSTORE
832 001212 .... DW xloop
833 001214 DEST CAPS1
833.1 001214 F4FF DW CAPS1-$
833.2 001216 ENDM
834 001216 .... CAPS2: DW EXIT
835 001218
836 001218 ;C LITERAL x -- append numeric
literal
837 001218 ; STATE @ IF ['] LIT ,XT I, THEN ; IMMEDIATE
838 001218 ; This tests STATE so that it can also be
used
839 001218 ; interpretively. (ANSI doesn't require
this.)
840 001218 IMMED LITERAL,7,'literal',DOCOLON
840.1 000000 PUBLIC LITERAL
840.2 001218 .... DW link
840.3 00121A FE DB 0FEh // ; immediate
(LSB=0)
840.4 00121B link SET $
840.5 00121B 07 DB 7
840.6 00121C 6C6974657261* DB 'literal'
840.7 001223 00 EVEN
840.8 001224 IF 'DOCOLON'='DOCODE'
840.9 001224 LITERAL: DW $+2
840.10 001224 ELSE
840.11 001224 .... LITERAL: DW DOCOLON
840.12 001226 ENDIF
840.13 001226 ENDM
841 001226 ............ DW STATE,FETCH,qbran
842 00122C DEST LITER1
842.1 00122C 0A00 DW LITER1-$
842.2 00122E ENDM
843 00122E ............* DW lit,lit,COMMAXT,ICOMMA
844 001236 .... LITER1: DW EXIT
845 001238
846 001238 ;Z DIGIT? c -- n -1 if c is a valid
digit
847 001238 ;Z -- x 0 otherwise
848 001238 ; [ HEX ] DUP 39 > 100 AND + silly
looking
849 001238 ; DUP 140 > 107 AND - 30 - but it
works!
850 001238 ; DUP BASE @ U< ;
851 001238 HEADER DIGITQ,6,'digit?',DOCOLON
851.1 000000 PUBLIC DIGITQ
851.2 001238 .... DW link
851.3 00123A FF DB 0FFh ; not immediate
851.4 00123B link SET $
851.5 00123B 06 DB 6
851.6 00123C 64696769743F DB 'digit?'
851.7 001242 EVEN
851.8 001242 IF 'DOCOLON'='DOCODE'
851.9 001242 DIGITQ: DW $+2
851.10 001242 ELSE
851.11 001242 .... DIGITQ: DW DOCOLON
851.12 001244 ENDIF
851.13 001244 ENDM
852 001244 ........3900* DW DUP,lit,39H,GREATER,lit,100H,ANDD,PLU
S
853 001254 ........4001* DW DUP,lit,140H,GREATER,lit,107H,ANDD
854 001262 ........3000* DW MINUS,lit,30H,MINUS
855 00126A ............* DW DUP,BASE,FETCH,ULESS,EXIT
856 001274
857 001274 ;Z ?SIGN adr n -- adr' n' f get optional
sign
858 001274 ;Z advance adr/n if sign; return NZ if
negative
859 001274 ; OVER C@ -- adr n c
860 001274 ; 2C - DUP ABS 1 = AND -- +=-1, -=+1, else
0
861 001274 ; DUP IF 1+ -- +=0, -=+2
862 001274 ; >R 1 /STRING R> -- adr' n'
f
863 001274 ; THEN ;
864 001274 HEADER QSIGN,5,'?sign',DOCOLON
864.1 000000 PUBLIC QSIGN
864.2 001274 .... DW link
864.3 001276 FF DB 0FFh ; not immediate
864.4 001277 link SET $
864.5 001277 05 DB 5
864.6 001278 3F7369676E DB '?sign'
864.7 00127D 00 EVEN
864.8 00127E IF 'DOCOLON'='DOCODE'
864.9 00127E QSIGN: DW $+2
864.10 00127E ELSE
864.11 00127E .... QSIGN: DW DOCOLON
864.12 001280 ENDIF
864.13 001280 ENDM
865 001280 ............* DW OVER,CFETCH,lit,2CH,MINUS,DUP,ABBS
866 00128E ....0100....* DW lit,1,EQUAL,ANDD,DUP,qbran
867 00129A DEST QSIGN1
867.1 00129A 0E00 DW QSIGN1-$
867.2 00129C ENDM
868 00129C ............* DW ONEPLUS,TOR,lit,1,SLASHSTRING,RFROM
869 0012A8 .... QSIGN1: DW EXIT
870 0012AA
871 0012AA ;C >NUMBER ud adr u -- ud' adr' u'
872 0012AA ;C convert string to
number
873 0012AA ; BEGIN
874 0012AA ; DUP WHILE
875 0012AA ; OVER C@ DIGIT?
876 0012AA ; 0= IF DROP EXIT THEN
877 0012AA ; >R 2SWAP BASE @ UD*
878 0012AA ; R> M+ 2SWAP
879 0012AA ; 1 /STRING
880 0012AA ; REPEAT ;
881 0012AA HEADER TONUMBER,7,'>number',DOCOLON
881.1 000000 PUBLIC TONUMBER
881.2 0012AA .... DW link
881.3 0012AC FF DB 0FFh ; not immediate
881.4 0012AD link SET $
881.5 0012AD 07 DB 7
881.6 0012AE 3E6E756D6265* DB '>number'
881.7 0012B5 00 EVEN
881.8 0012B6 IF 'DOCOLON'='DOCODE'
881.9 0012B6 TONUMBER: DW $+2
881.10 0012B6 ELSE
881.11 0012B6 .... TONUMBER: DW DOCOLON
881.12 0012B8 ENDIF
881.13 0012B8 ENDM
882 0012B8 ........ TONUM1: DW DUP,qbran
883 0012BC DEST TONUM3
883.1 0012BC 2C00 DW TONUM3-$
883.2 0012BE ENDM
884 0012BE ............ DW OVER,CFETCH,DIGITQ
885 0012C4 ........ DW ZEROEQUAL,qbran
886 0012C8 DEST TONUM2
886.1 0012C8 0600 DW TONUM2-$
886.2 0012CA ENDM
887 0012CA ........ DW DROP,EXIT
888 0012CE ............*TONUM2: DW TOR,TWOSWAP,BASE,FETCH,UDSTAR
889 0012D8 ............ DW RFROM,MPLUS,TWOSWAP
890 0012DE ....0100....* DW lit,1,SLASHSTRING,bran
891 0012E6 DEST TONUM1
891.1 0012E6 D2FF DW TONUM1-$
891.2 0012E8 ENDM
892 0012E8 .... TONUM3: DW EXIT
893 0012EA
894 0012EA ;Z ?NUMBER c-addr -- n -1 string->number
895 0012EA ;Z -- c-addr 0 if convert
error
896 0012EA ; DUP 0 0 ROT COUNT -- ca ud adr
n
897 0012EA ; ?SIGN >R >NUMBER -- ca ud adr'
n'
898 0012EA ; IF R> 2DROP 2DROP 0 -- ca 0 (error)
899 0012EA ; ELSE 2DROP NIP R>
900 0012EA ; IF NEGATE THEN -1 -- n -1 (ok)
901 0012EA ; THEN ;
902 0012EA HEADER QNUMBER,7,'?number',DOCOLON
902.1 000000 PUBLIC QNUMBER
902.2 0012EA .... DW link
902.3 0012EC FF DB 0FFh ; not immediate
902.4 0012ED link SET $
902.5 0012ED 07 DB 7
902.6 0012EE 3F6E756D6265* DB '?number'
902.7 0012F5 00 EVEN
902.8 0012F6 IF 'DOCOLON'='DOCODE'
902.9 0012F6 QNUMBER: DW $+2
902.10 0012F6 ELSE
902.11 0012F6 .... QNUMBER: DW DOCOLON
902.12 0012F8 ENDIF
902.13 0012F8 ENDM
903 0012F8 ........0000* DW DUP,lit,0,DUP,ROT,COUNT
904 001304 ............* DW QSIGN,TOR,TONUMBER,qbran
905 00130C DEST QNUM1
905.1 00130C 1000 DW QNUM1-$
905.2 00130E ENDM
906 00130E ............* DW RFROM,TWODROP,TWODROP,lit,0
907 001318 .... DW bran
908 00131A DEST QNUM3
908.1 00131A 1200 DW QNUM3-$
908.2 00131C ENDM
909 00131C ............*QNUM1: DW TWODROP,NIP,RFROM,qbran
910 001324 DEST QNUM2
910.1 001324 0400 DW QNUM2-$
910.2 001326 ENDM
911 001326 .... DW NEGATE
912 001328 ....FFFF QNUM2: DW lit,-1
913 00132C .... QNUM3: DW EXIT
914 00132E
915 00132E ;Z INTERPRET i*x c-addr u -- j*x
916 00132E ;Z interpret given
buffer
917 00132E ; This is a common factor of EVALUATE and
QUIT.
918 00132E ; ref. dpANS-6, 3.4 The Forth Text Interpreter
919 00132E ; 'SOURCE 2! 0 >IN !
920 00132E ; BEGIN
921 00132E ; BL WORD DUP C@ WHILE -- textadr
922 00132E ; CAPITALIZE
923 00132E ; FIND -- a 0/1/-1
924 00132E ; ?DUP IF -- xt 1/-1
925 00132E ; 1+ STATE @ 0= OR IMMED or
interp?
926 00132E ; IF EXECUTE ELSE ,XT THEN
927 00132E ; ELSE -- textadr
928 00132E ; ?NUMBER
929 00132E ; IF POSTPONE LITERAL converted
ok
930 00132E ; ELSE COUNT TYPE 3F EMIT CR ABORT
err
931 00132E ; THEN
932 00132E ; THEN
933 00132E ; REPEAT DROP ;
934 00132E HEADER INTERPRET,9,'interpret',DOCOLON
934.1 000000 PUBLIC INTERPRET
934.2 00132E .... DW link
934.3 001330 FF DB 0FFh ; not immediate
934.4 001331 link SET $
934.5 001331 09 DB 9
934.6 001332 696E74657270* DB 'interpret'
934.7 00133B 00 EVEN
934.8 00133C IF 'DOCOLON'='DOCODE'
934.9 00133C INTERPRET: DW $+2
934.10 00133C ELSE
934.11 00133C .... INTERPRET: DW DOCOLON
934.12 00133E ENDIF
934.13 00133E ENDM
935 00133E ............* DW TICKSOURCE,TWOSTORE,lit,0,TOIN,STORE
936 00134A ............*INTER1: DW BLANK,WORDD,DUP,CFETCH,qbran
937 001354 DEST INTER9
937.1 001354 4400 DW INTER9-$
937.2 001356 ENDM
938 001356 .... DW CAPITALIZE
939 001358 ............ DW FIND,QDUP,qbran
940 00135E DEST INTER4
940.1 00135E 1C00 DW INTER4-$
940.2 001360 ENDM
941 001360 ............* DW ONEPLUS,STATE,FETCH,ZEROEQUAL,ORR
942 00136A .... DW qbran
943 00136C DEST INTER2
943.1 00136C 0800 DW INTER2-$
943.2 00136E ENDM
944 00136E ........ DW EXECUTE,bran
945 001372 DEST INTER3
945.1 001372 0400 DW INTER3-$
945.2 001374 ENDM
946 001374 .... INTER2: DW COMMAXT
947 001376 .... INTER3: DW bran
948 001378 DEST INTER8
948.1 001378 1C00 DW INTER8-$
948.2 00137A ENDM
949 00137A ........ INTER4: DW QNUMBER,qbran
950 00137E DEST INTER5
950.1 00137E 0800 DW INTER5-$
950.2 001380 ENDM
951 001380 ........ DW LITERAL,bran
952 001384 DEST INTER6
952.1 001384 1000 DW INTER6-$
952.2 001386 ENDM
953 001386 ............*INTER5: DW COUNT,TYP,lit,3FH,EMIT,CR,ABORT
954 001394 INTER6:
955 001394 .... INTER8: DW bran
956 001396 DEST INTER1
956.1 001396 B4FF DW INTER1-$
956.2 001398 ENDM
957 001398 ........ INTER9: DW DROP,EXIT
958 00139C
959 00139C ;C EVALUATE i*x c-addr u -- j*x interprt
string
960 00139C ; 'SOURCE 2@ >R >R >IN @ >R
961 00139C ; INTERPRET
962 00139C ; R> >IN ! R> R> 'SOURCE 2! ;
963 00139C HEADER EVALUATE,8,'evaluate',DOCOLON
963.1 000000 PUBLIC EVALUATE
963.2 00139C .... DW link
963.3 00139E FF DB 0FFh ; not immediate
963.4 00139F link SET $
963.5 00139F 08 DB 8
963.6 0013A0 6576616C7561* DB 'evaluate'
963.7 0013A8 EVEN
963.8 0013A8 IF 'DOCOLON'='DOCODE'
963.9 0013A8 EVALUATE: DW $+2
963.10 0013A8 ELSE
963.11 0013A8 .... EVALUATE: DW DOCOLON
963.12 0013AA ENDIF
963.13 0013AA ENDM
964 0013AA ............* DW TICKSOURCE,TWOFETCH,TOR,TOR
965 0013B2 ............* DW TOIN,FETCH,TOR,INTERPRET
966 0013BA ............* DW RFROM,TOIN,STORE,RFROM,RFROM
967 0013C4 ............ DW TICKSOURCE,TWOSTORE,EXIT
968 0013CA
969 0013CA #define PREFIXPROMPT 0
970 0013CA
971 0013CA ; C DOTSTATUS -- display system status
972 0013CA HEADLESS DOTSTATUS,DOCOLON
972.1 000000 PUBLIC DOTSTATUS
972.2 0013CA IF 'DOCOLON'='DOCODE'
972.3 0013CA DOTSTATUS: DW $+2
972.4 0013CA ELSE
972.5 0013CA .... DOTSTATUS: DW DOCOLON
972.6 0013CC ENDIF
972.7 0013CC ENDM
973 0013CC ....1100.... DW lit,11H,EMIT ; send XON
974 0013D2 .... DW CR
975 0013D4 ; IF PREFIXPROMPT=1
976 0013D4 ............* DW STATE,FETCH,ZEROEQUAL,qbran
977 0013DC DEST DOT1
977.1 0013DC 0A00 DW DOT1-$
977.2 0013DE ENDM
978 0013DE .... DW XISQUOTE
979 0013E0 023E20 DB 2,'> ' ; for prefix prompt
amforth style
980 0013E3 00 EVEN
981 0013E4 .... DW ITYPE
982 0013E6 ; ENDIF
983 0013E6 .... DOT1: DW EXIT
984 0013E8
985 0013E8 ; C PROMPT -- prompt user
986 0013E8 HEADLESS PROMPT,DOCOLON
986.1 000000 PUBLIC PROMPT
986.2 0013E8 IF 'DOCOLON'='DOCODE'
986.3 0013E8 PROMPT: DW $+2
986.4 0013E8 ELSE
986.5 0013E8 .... PROMPT: DW DOCOLON
986.6 0013EA ENDIF
986.7 0013EA ENDM
987 0013EA ; IF PREFIXPROMPT!=1
988 0013EA ; DW CR
989 0013EA ; DW STATE,FETCH,ZEROEQUAL,qbran
990 0013EA ; DEST PROMPT1
991 0013EA .... DW XISQUOTE
992 0013EC 03206F6B DB 3,' ok' ; for amforth style
993 0013F0 EVEN
994 0013F0 .... DW ITYPE
995 0013F2 ; ENDIF
996 0013F2 .... PROMPT1:DW EXIT
997 0013F4
998 0013F4 ;C QUIT -- R: i*x -- interpret from
kbd
999 0013F4 ; L0 LP ! R0 RP! 0 STATE !
1000 0013F4 ; BEGIN
1001 0013F4 ; xon EMIT
1002 0013F4 ; TIB DUP TIBSIZE ACCEPT
1003 0013F4 ; xoff EMIT SPACE
1004 0013F4 ; INTERPRET
1005 0013F4 ; CR STATE @ 0= IF ." OK" THEN
1006 0013F4 ; AGAIN ;
1007 0013F4 HEADER QUIT,4,'quit',DOCOLON
1007.1 000000 PUBLIC QUIT
1007.2 0013F4 .... DW link
1007.3 0013F6 FF DB 0FFh ; not immediate
1007.4 0013F7 link SET $
1007.5 0013F7 04 DB 4
1007.6 0013F8 71756974 DB 'quit'
1007.7 0013FC EVEN
1007.8 0013FC IF 'DOCOLON'='DOCODE'
1007.9 0013FC QUIT: DW $+2
1007.10 0013FC ELSE
1007.11 0013FC .... QUIT: DW DOCOLON
1007.12 0013FE ENDIF
1007.13 0013FE ENDM
1008 0013FE ............ DW L0,LP,STORE
1009 001404 ............* DW RZERO,RPSTORE,lit,0,STATE,STORE
1010 001410 QUIT1:
1011 001410 ............* DW STATE,FETCH,ZEROEQUAL,qbran
1012 001418 DEST QUIT2
1012.1 001418 0400 DW QUIT2-$
1012.2 00141A ENDM
1013 00141A .... DW DOTSTATUS
1014 00141C ............*QUIT2: DW TIB,DUP,TIBSIZE,ACCEPT
1015 001424 .... DW CR
1016 001426 ; DW lit,13H,EMIT ; send
XOFF
1017 001426 ; DW SPACE
1018 001426 .... DW INTERPRET
1019 001428 .... DW PROMPT
1020 00142A .... DW bran
1021 00142C DEST QUIT1
1021.1 00142C E4FF DW QUIT1-$
1021.2 00142E ENDM
1022 000000 PUBLIC QUITIP
1023 00142E QUITIP equ QUIT+2
1024 00142E
1025 00142E
1026 00142E
1027 00142E ;C ABORT i*x -- R: j*x -- clear stk &
QUIT
1028 00142E ; S0 SP! QUIT ;
1029 00142E HEADER ABORT,5,'abort',DOCOLON
1029.1 000000 PUBLIC ABORT
1029.2 00142E .... DW link
1029.3 001430 FF DB 0FFh ; not immediate
1029.4 001431 link SET $
1029.5 001431 05 DB 5
1029.6 001432 61626F7274 DB 'abort'
1029.7 001437 00 EVEN
1029.8 001438 IF 'DOCOLON'='DOCODE'
1029.9 001438 ABORT: DW $+2
1029.10 001438 ELSE
1029.11 001438 .... ABORT: DW DOCOLON
1029.12 00143A ENDIF
1029.13 00143A ENDM
1030 00143A ............ DW S0,SPSTORE,QUIT ; QUIT never
returns
1031 001440
1032 001440 ;Z ?ABORT f c-addr u -- abort & print
msg
1033 001440 ; ROT IF ITYPE ABORT THEN 2DROP ;
1034 001440 HEADER QABORT,6,'?abort',DOCOLON
1034.1 000000 PUBLIC QABORT
1034.2 001440 .... DW link
1034.3 001442 FF DB 0FFh ; not immediate
1034.4 001443 link SET $
1034.5 001443 06 DB 6
1034.6 001444 3F61626F7274 DB '?abort'
1034.7 00144A EVEN
1034.8 00144A IF 'DOCOLON'='DOCODE'
1034.9 00144A QABORT: DW $+2
1034.10 00144A ELSE
1034.11 00144A .... QABORT: DW DOCOLON
1034.12 00144C ENDIF
1034.13 00144C ENDM
1035 00144C ........ DW ROT,qbran
1036 001450 DEST QABO1
1036.1 001450 0600 DW QABO1-$
1036.2 001452 ENDM
1037 001452 ........ DW ITYPE,ABORT
1038 001456 ........ QABO1: DW TWODROP,EXIT
1039 00145A
1040 00145A ;C ABORT" i*x 0 -- i*x R: j*x -- j*x
x1=0
1041 00145A ;C i*x x1 -- R: j*x --
x1<>0
1042 00145A ; POSTPONE IS" POSTPONE ?ABORT ; IMMEDIATE
1043 00145A IMMED ABORTQUOTE,6,'abort"',DOCOLON
1043.1 000000 PUBLIC ABORTQUOTE
1043.2 00145A .... DW link
1043.3 00145C FE DB 0FEh // ; immediate
(LSB=0
)
1043.4 00145D link SET $
1043.5 00145D 06 DB 6
1043.6 00145E 61626F727422 DB 'abort"'
1043.7 001464 EVEN
1043.8 001464 IF 'DOCOLON'='DOCODE'
1043.9 001464 ABORTQUOTE: DW $+2
1043.10 001464 ELSE
1043.11 001464 .... ABORTQUOTE: DW DOCOLON
1043.12 001466 ENDIF
1043.13 001466 ENDM
1044 001466 .... DW ISQUOTE
1045 001468 ............ DW lit,QABORT,COMMAXT
1046 00146E .... DW EXIT
1047 001470
1048 001470 ;C ' -- xt find word in dictionary
1049 001470 ; BL WORD CAPITALIZE FIND
1050 001470 ; 0= ABORT" ?" ;
1051 001470 HEADER TICK,1,27h,DOCOLON
1051.1 000000 PUBLIC TICK
1051.2 001470 .... DW link
1051.3 001472 FF DB 0FFh ; not immediate
1051.4 001473 link SET $
1051.5 001473 01 DB 1
1051.6 001474 27 DB 27h
1051.7 001475 00 EVEN
1051.8 001476 IF 'DOCOLON'='DOCODE'
1051.9 001476 TICK: DW $+2
1051.10 001476 ELSE
1051.11 001476 .... TICK: DW DOCOLON
1051.12 001478 ENDIF
1051.13 001478 ENDM
1052 001478 ............* DW BLANK,WORDD,CAPITALIZE,FIND,ZEROEQUAL
,XISQUOTE
1053 001484 013F DB 1,'?'
1054 001486 ........ DW QABORT,EXIT
1055 00148A
1056 00148A ;C CHAR -- char parse ASCII
character
1057 00148A ; BL WORD 1+ C@ ;
1058 00148A HEADER CHARR,4,'char',DOCOLON
1058.1 000000 PUBLIC CHARR
1058.2 00148A .... DW link
1058.3 00148C FF DB 0FFh ; not immediate
1058.4 00148D link SET $
1058.5 00148D 04 DB 4
1058.6 00148E 63686172 DB 'char'
1058.7 001492 EVEN
1058.8 001492 IF 'DOCOLON'='DOCODE'
1058.9 001492 CHARR: DW $+2
1058.10 001492 ELSE
1058.11 001492 .... CHARR: DW DOCOLON
1058.12 001494 ENDIF
1058.13 001494 ENDM
1059 001494 ............* DW BLANK,WORDD,ONEPLUS,CFETCH,EXIT
1060 00149E
1061 00149E ;C [CHAR] -- compile character
literal
1062 00149E ; CHAR ['] LIT ,XT I, ; IMMEDIATE
1063 00149E IMMED BRACCHAR,6,'[char]',DOCOLON
1063.1 000000 PUBLIC BRACCHAR
1063.2 00149E .... DW link
1063.3 0014A0 FE DB 0FEh // ; immediate
(LSB=0)
1063.4 0014A1 link SET $
1063.5 0014A1 06 DB 6
1063.6 0014A2 5B636861725D DB '[char]'
1063.7 0014A8 EVEN
1063.8 0014A8 IF 'DOCOLON'='DOCODE'
1063.9 0014A8 BRACCHAR: DW $+2
1063.10 0014A8 ELSE
1063.11 0014A8 .... BRACCHAR: DW DOCOLON
1063.12 0014AA ENDIF
1063.13 0014AA ENDM
1064 0014AA .... DW CHARR
1065 0014AC ............ DW lit,lit,COMMAXT
1066 0014B2 ........ DW ICOMMA,EXIT
1067 0014B6
1068 0014B6 ;C ( -- skip input until
)
1069 0014B6 ; [ HEX ] 29 WORD DROP ; IMMEDIATE
1070 0014B6 IMMED PAREN,1,'(',DOCOLON
1070.1 000000 PUBLIC PAREN
1070.2 0014B6 .... DW link
1070.3 0014B8 FE DB 0FEh // ; immediate
(LSB=0)
1070.4 0014B9 link SET $
1070.5 0014B9 01 DB 1
1070.6 0014BA 28 DB '('
1070.7 0014BB 00 EVEN
1070.8 0014BC IF 'DOCOLON'='DOCODE'
1070.9 0014BC PAREN: DW $+2
1070.10 0014BC ELSE
1070.11 0014BC .... PAREN: DW DOCOLON
1070.12 0014BE ENDIF
1070.13 0014BE ENDM
1071 0014BE ....2900....* DW lit,29H,WORDD,DROP,EXIT
1072 0014C8
1073 0014C8 ; COMPILER =====================================
=
1074 0014C8
1075 0014C8 ;Z HEADER -- create a Forth word
header
1076 0014C8 ; LATEST @ H, 0FF HC, link & IMMED
field
1077 0014C8 ; HHERE LATEST ! new "latest"
link
1078 0014C8 ; BL HWORD HC@ 1+ HALLOT name field
1079 0014C8 ; ALIGN ;
1080 0014C8 ; Separate headers model.
1081 0014C8 HEADER HEADR,6,'header',DOCOLON
1081.1 000000 PUBLIC HEADR
1081.2 0014C8 .... DW link
1081.3 0014CA FF DB 0FFh ; not immediate
1081.4 0014CB link SET $
1081.5 0014CB 06 DB 6
1081.6 0014CC 686561646572 DB 'header'
1081.7 0014D2 EVEN
1081.8 0014D2 IF 'DOCOLON'='DOCODE'
1081.9 0014D2 HEADR: DW $+2
1081.10 0014D2 ELSE
1081.11 0014D2 .... HEADR: DW DOCOLON
1081.12 0014D4 ENDIF
1081.13 0014D4 ENDM
1082 0014D4 ............ DW LATEST,FETCH,HCOMMA ; link
1083 0014DA ....FF00.... DW lit,0FFh,HCCOMMA ; immediate
flag - see
note
below
1084 0014E0 ............ DW HHERE,LATEST,STORE
1085 0014E6 ............* DW BLANK,HWORD,HCFETCH,ONEPLUS,HALLOT
1086 0014F0 ........ DW ALIGNN,EXIT ; MSP430: headers in I
space must be
aligned
1087 0014F4 ; Note for Flashable MSP430: when compiling to
RAM, we need to set
1088 0014F4 ; the immediate byte to 0FFH. When compiling to
Flash, the word IC!
1089 0014F4 ; will not write 0FFH to erased Flash (because
the byte is already 0FFH).
1090 0014F4 ; Thus we can write this byte at a later time
(with IMMEDIATE).
1091 0014F4
1092 0014F4 ;Z ) -- run-time action of
DOES>
1109 001526 ; R> adrs of headless DOES>
def'n
1110 001526 ; LATEST @ NFA>CFA code field to fix
up
1111 001526 ; !CF ;
1112 001526 HEADER XDOES,7,'(does>)',DOCOLON
1112.1 000000 PUBLIC XDOES
1112.2 001526 .... DW link
1112.3 001528 FF DB 0FFh ; not immediate
1112.4 001529 link SET $
1112.5 001529 07 DB 7
1112.6 00152A 28646F65733E* DB '(does>)'
1112.7 001531 00 EVEN
1112.8 001532 IF 'DOCOLON'='DOCODE'
1112.9 001532 XDOES: DW $+2
1112.10 001532 ELSE
1112.11 001532 .... XDOES: DW DOCOLON
1112.12 001534 ENDIF
1112.13 001534 ENDM
1113 001534 ............* DW RFROM,LATEST,FETCH,NFATOCFA,STORECF
1114 00153E .... DW EXIT
1115 001540
1116 001540 ;C DOES> -- change action of latest
def'n
1117 001540 ; COMPILE (DOES>)
1118 001540 ; dodoes ,JMP ; IMMEDIATE
1119 001540 ; Note that MSP430 uses a JMP, not a CALL, to
DODOES.
1120 001540 IMMED DOES,5,'does>',DOCOLON
1120.1 000000 PUBLIC DOES
1120.2 001540 .... DW link
1120.3 001542 FE DB 0FEh // ; immediate
(LSB=0)
1120.4 001543 link SET $
1120.5 001543 05 DB 5
1120.6 001544 646F65733E DB 'does>'
1120.7 001549 00 EVEN
1120.8 00154A IF 'DOCOLON'='DOCODE'
1120.9 00154A DOES: DW $+2
1120.10 00154A ELSE
1120.11 00154A .... DOES: DW DOCOLON
1120.12 00154C ENDIF
1120.13 00154C ENDM
1121 00154C ............ DW lit,XDOES,COMMAXT
1122 001552 ............* DW lit,dodoes,COMMAJMP,EXIT
1123 00155A
1124 00155A ;C RECURSE -- recurse current definition
1125 00155A ; LATEST @ NFA>CFA ,XT ; IMMEDIATE
1126 00155A ; NEWEST @ NFA>CFA ,XT ; IMMEDIATE
Flashable
1127 00155A IMMED RECURSE,7,'recurse',DOCOLON
1127.1 000000 PUBLIC RECURSE
1127.2 00155A .... DW link
1127.3 00155C FE DB 0FEh // ; immediate
(LSB=0)
1127.4 00155D link SET $
1127.5 00155D 07 DB 7
1127.6 00155E 726563757273* DB 'recurse'
1127.7 001565 00 EVEN
1127.8 001566 IF 'DOCOLON'='DOCODE'
1127.9 001566 RECURSE: DW $+2
1127.10 001566 ELSE
1127.11 001566 .... RECURSE: DW DOCOLON
1127.12 001568 ENDIF
1127.13 001568 ENDM
1128 001568 ............* DW NEWEST,FETCH,NFATOCFA,COMMAXT,EXIT
1129 001572
1130 001572 ;C [ -- enter interpretive
state
1131 001572 ; 0 STATE ! ; IMMEDIATE
1132 001572 IMMED LEFTBRACKET,1,'[',DOCOLON
1132.1 000000 PUBLIC LEFTBRACKET
1132.2 001572 .... DW link
1132.3 001574 FE DB 0FEh // ; immediate
(LSB=0)
1132.4 001575 link SET $
1132.5 001575 01 DB 1
1132.6 001576 5B DB '['
1132.7 001577 00 EVEN
1132.8 001578 IF 'DOCOLON'='DOCODE'
1132.9 001578 LEFTBRACKET: DW $+2
1132.10 001578 ELSE
1132.11 001578 .... LEFTBRACKET: DW DOCOLON
1132.12 00157A ENDIF
1132.13 00157A ENDM
1133 00157A ....0000....* DW lit,0,STATE,STORE,EXIT
1134 001584
1135 001584 ;C ] -- enter compiling state
1136 001584 ; -1 STATE ! ;
1137 001584 HEADER RIGHTBRACKET,1,']',DOCOLON
1137.1 000000 PUBLIC RIGHTBRACKET
1137.2 001584 .... DW link
1137.3 001586 FF DB 0FFh ; not immediate
1137.4 001587 link SET $
1137.5 001587 01 DB 1
1137.6 001588 5D DB ']'
1137.7 001589 00 EVEN
1137.8 00158A IF 'DOCOLON'='DOCODE'
1137.9 00158A RIGHTBRACKET: DW $+2
1137.10 00158A ELSE
1137.11 00158A .... RIGHTBRACKET: DW DOCOLON
1137.12 00158C ENDIF
1137.13 00158C ENDM
1138 00158C ....FFFF....* DW lit,-1,STATE,STORE,EXIT
1139 001596
1140 001596 ;Z HIDE -- "hide" latest definition
Flashable
1141 001596 ; LATEST @ DUP NEWEST ! NFA>LFA H@ LATEST !
;
1142 001596 HEADER HIDE,4,'hide',DOCOLON
1142.1 000000 PUBLIC HIDE
1142.2 001596 .... DW link
1142.3 001598 FF DB 0FFh ; not immediate
1142.4 001599 link SET $
1142.5 001599 04 DB 4
1142.6 00159A 68696465 DB 'hide'
1142.7 00159E EVEN
1142.8 00159E IF 'DOCOLON'='DOCODE'
1142.9 00159E HIDE: DW $+2
1142.10 00159E ELSE
1142.11 00159E .... HIDE: DW DOCOLON
1142.12 0015A0 ENDIF
1142.13 0015A0 ENDM
1143 0015A0 ............* DW LATEST,FETCH,DUP,NEWEST,STORE
1144 0015AA ............* DW NFATOLFA,HFETCH,LATEST,STORE,EXIT
1145 0015B4
1146 0015B4 ;Z REVEAL -- "reveal" latest definition
Flashable
1147 0015B4 ; NEWEST @ LATEST ! ;
1148 0015B4 HEADER REVEAL,6,'reveal',DOCOLON
1148.1 000000 PUBLIC REVEAL
1148.2 0015B4 .... DW link
1148.3 0015B6 FF DB 0FFh ; not immediate
1148.4 0015B7 link SET $
1148.5 0015B7 06 DB 6
1148.6 0015B8 72657665616C DB 'reveal'
1148.7 0015BE EVEN
1148.8 0015BE IF 'DOCOLON'='DOCODE'
1148.9 0015BE REVEAL: DW $+2
1148.10 0015BE ELSE
1148.11 0015BE .... REVEAL: DW DOCOLON
1148.12 0015C0 ENDIF
1148.13 0015C0 ENDM
1149 0015C0 ............* DW NEWEST,FETCH,LATEST,STORE,EXIT
1150 0015CA
1151 0015CA ;C IMMEDIATE -- make last def'n immediate
1152 0015CA ; 0FE LATEST @ 1- HC! ; set Flashable
immediate flag
1153 0015CA HEADER IMMEDIATE,9,'immediate',DOCOLON
1153.1 000000 PUBLIC IMMEDIATE
1153.2 0015CA .... DW link
1153.3 0015CC FF DB 0FFh ; not immediate
1153.4 0015CD link SET $
1153.5 0015CD 09 DB 9
1153.6 0015CE 696D6D656469* DB 'immediate'
1153.7 0015D7 00 EVEN
1153.8 0015D8 IF 'DOCOLON'='DOCODE'
1153.9 0015D8 IMMEDIATE: DW $+2
1153.10 0015D8 ELSE
1153.11 0015D8 .... IMMEDIATE: DW DOCOLON
1153.12 0015DA ENDIF
1153.13 0015DA ENDM
1154 0015DA ....FE00....* DW lit,0FEh,LATEST,FETCH,ONEMINUS,HCSTOR
E
1155 0015E6 .... DW EXIT
1156 0015E8
1157 0015E8 ;C : -- begin a colon definition
1158 0015E8 ; DUP CELL+ >R @ ,XT ;
1205 00165A ; The phrase ['] xxx ,XT appears so often
that
1206 00165A ; this word was created to combine the
actions
1207 00165A ; of LIT and ,XT. It takes an inline literal
1208 00165A ; execution token and appends it to the
dict.
1209 00165A ; HEADER COMPILE,7,'COMPILE',DOCOLON
1210 00165A ; DW RFROM,DUP,CELLPLUS,TOR
1211 00165A ; DW FETCH,COMMAXT,EXIT
1212 00165A ; N.B.: not used in the current implementation
1213 00165A
1214 00165A ; CONTROL STRUCTURES ===========================
=
1215 00165A
1216 00165A ;C IF -- adrs conditional forward
branch
1217 00165A ; ['] qbran ,BRANCH IHERE ,NONE ;
Flashable
1218 00165A ; IMMEDIATE
1219 00165A IMMED IFF,2,'if',DOCOLON
1219.1 000000 PUBLIC IFF
1219.2 00165A .... DW link
1219.3 00165C FE DB 0FEh // ; immediate
(LSB=0)
1219.4 00165D link SET $
1219.5 00165D 02 DB 2
1219.6 00165E 6966 DB 'if'
1219.7 001660 EVEN
1219.8 001660 IF 'DOCOLON'='DOCODE'
1219.9 001660 IFF: DW $+2
1219.10 001660 ELSE
1219.11 001660 .... IFF: DW DOCOLON
1219.12 001662 ENDIF
1219.13 001662 ENDM
1220 001662 ............ DW lit,qbran,COMMABRANCH
1221 001668 ............ DW IHERE,COMMANONE,EXIT
1222 00166E
1223 00166E ;C THEN adrs -- resolve forward
branch
1224 00166E ; IHERE SWAP !DEST ; IMMEDIATE
1225 00166E IMMED THEN,4,'then',DOCOLON
1225.1 000000 PUBLIC THEN
1225.2 00166E .... DW link
1225.3 001670 FE DB 0FEh // ; immediate
(LSB=0)
1225.4 001671 link SET $
1225.5 001671 04 DB 4
1225.6 001672 7468656E DB 'then'
1225.7 001676 EVEN
1225.8 001676 IF 'DOCOLON'='DOCODE'
1225.9 001676 THEN: DW $+2
1225.10 001676 ELSE
1225.11 001676 .... THEN: DW DOCOLON
1225.12 001678 ENDIF
1225.13 001678 ENDM
1226 001678 ............* DW IHERE,SWAP,STOREDEST,EXIT
1227 001680
1228 001680 ;C ELSE adrs1 -- adrs2 branch for
IF..ELSE
1229 001680 ; ['] branch ,BRANCH IHERE ,NONE
Flashable
1230 001680 ; SWAP POSTPONE THEN ; IMMEDIATE
1231 001680 IMMED ELSS,4,'else',DOCOLON
1231.1 000000 PUBLIC ELSS
1231.2 001680 .... DW link
1231.3 001682 FE DB 0FEh // ; immediate
(LSB=0)
1231.4 001683 link SET $
1231.5 001683 04 DB 4
1231.6 001684 656C7365 DB 'else'
1231.7 001688 EVEN
1231.8 001688 IF 'DOCOLON'='DOCODE'
1231.9 001688 ELSS: DW $+2
1231.10 001688 ELSE
1231.11 001688 .... ELSS: DW DOCOLON
1231.12 00168A ENDIF
1231.13 00168A ENDM
1232 00168A ............ DW lit,bran,COMMABRANCH
1233 001690 ........ DW IHERE,COMMANONE
1234 001694 ............ DW SWAP,THEN,EXIT
1235 00169A
1236 00169A ;C BEGIN -- adrs target for bwd.
branch
1237 00169A ; IHERE ; IMMEDIATE
1238 00169A IMMED BEGIN,5,'begin',DOCOLON
1238.1 000000 PUBLIC BEGIN
1238.2 00169A .... DW link
1238.3 00169C FE DB 0FEh // ; immediate
(LSB=0)
1238.4 00169D link SET $
1238.5 00169D 05 DB 5
1238.6 00169E 626567696E DB 'begin'
1238.7 0016A3 00 EVEN
1238.8 0016A4 IF 'DOCOLON'='DOCODE'
1238.9 0016A4 BEGIN: DW $+2
1238.10 0016A4 ELSE
1238.11 0016A4 .... BEGIN: DW DOCOLON
1238.12 0016A6 ENDIF
1238.13 0016A6 ENDM
1239 0016A6 ........ DW IHERE,EXIT
1240 0016AA
1241 0016AA ;C UNTIL adrs -- conditional backward
branch
1242 0016AA ; ['] qbran ,BRANCH ,DEST ; IMMEDIATE
1243 0016AA ; conditional backward branch
1244 0016AA IMMED UNTIL,5,'until',DOCOLON
1244.1 000000 PUBLIC UNTIL
1244.2 0016AA .... DW link
1244.3 0016AC FE DB 0FEh // ; immediate
(LSB=0)
1244.4 0016AD link SET $
1244.5 0016AD 05 DB 5
1244.6 0016AE 756E74696C DB 'until'
1244.7 0016B3 00 EVEN
1244.8 0016B4 IF 'DOCOLON'='DOCODE'
1244.9 0016B4 UNTIL: DW $+2
1244.10 0016B4 ELSE
1244.11 0016B4 .... UNTIL: DW DOCOLON
1244.12 0016B6 ENDIF
1244.13 0016B6 ENDM
1245 0016B6 ............ DW lit,qbran,COMMABRANCH
1246 0016BC ........ DW COMMADEST,EXIT
1247 0016C0
1248 0016C0 ;X AGAIN adrs -- uncond'l backward
branch
1249 0016C0 ; ['] branch ,BRANCH ,DEST ; IMMEDIATE
1250 0016C0 ; unconditional backward branch
1251 0016C0 IMMED AGAIN,5,'again',DOCOLON
1251.1 000000 PUBLIC AGAIN
1251.2 0016C0 .... DW link
1251.3 0016C2 FE DB 0FEh // ; immediate
(LSB=0)
1251.4 0016C3 link SET $
1251.5 0016C3 05 DB 5
1251.6 0016C4 616761696E DB 'again'
1251.7 0016C9 00 EVEN
1251.8 0016CA IF 'DOCOLON'='DOCODE'
1251.9 0016CA AGAIN: DW $+2
1251.10 0016CA ELSE
1251.11 0016CA .... AGAIN: DW DOCOLON
1251.12 0016CC ENDIF
1251.13 0016CC ENDM
1252 0016CC ............ DW lit,bran,COMMABRANCH
1253 0016D2 ........ DW COMMADEST,EXIT
1254 0016D6
1255 0016D6 ;C WHILE adrs1 -- adrs2 adrs1
1256 0016D6 ; branch for WHILE
loop
1257 0016D6 ; POSTPONE IF SWAP ; IMMEDIATE
1258 0016D6 IMMED WHILE,5,'while',DOCOLON
1258.1 000000 PUBLIC WHILE
1258.2 0016D6 .... DW link
1258.3 0016D8 FE DB 0FEh // ; immediate
(LSB=0)
1258.4 0016D9 link SET $
1258.5 0016D9 05 DB 5
1258.6 0016DA 7768696C65 DB 'while'
1258.7 0016DF 00 EVEN
1258.8 0016E0 IF 'DOCOLON'='DOCODE'
1258.9 0016E0 WHILE: DW $+2
1258.10 0016E0 ELSE
1258.11 0016E0 .... WHILE: DW DOCOLON
1258.12 0016E2 ENDIF
1258.13 0016E2 ENDM
1259 0016E2 ............ DW IFF,SWAP,EXIT
1260 0016E8
1261 0016E8 ;C REPEAT adrs2 adrs1 -- resolve WHILE
loop
1262 0016E8 ; POSTPONE AGAIN POSTPONE THEN ; IMMEDIATE
1263 0016E8 IMMED REPEAT,6,'repeat',DOCOLON
1263.1 000000 PUBLIC REPEAT
1263.2 0016E8 .... DW link
1263.3 0016EA FE DB 0FEh // ; immediate
(LSB=0)
1263.4 0016EB link SET $
1263.5 0016EB 06 DB 6
1263.6 0016EC 726570656174 DB 'repeat'
1263.7 0016F2 EVEN
1263.8 0016F2 IF 'DOCOLON'='DOCODE'
1263.9 0016F2 REPEAT: DW $+2
1263.10 0016F2 ELSE
1263.11 0016F2 .... REPEAT: DW DOCOLON
1263.12 0016F4 ENDIF
1263.13 0016F4 ENDM
1264 0016F4 ............ DW AGAIN,THEN,EXIT
1265 0016FA
1266 0016FA ;Z >L x -- L: -- x move to leave
stack
1267 0016FA ; CELL LP +! LP @ ! ; (L stack grows
up)
1268 0016FA HEADER TOL,2,'>l',DOCOLON
1268.1 000000 PUBLIC TOL
1268.2 0016FA .... DW link
1268.3 0016FC FF DB 0FFh ; not immediate
1268.4 0016FD link SET $
1268.5 0016FD 02 DB 2
1268.6 0016FE 3E6C DB '>l'
1268.7 001700 EVEN
1268.8 001700 IF 'DOCOLON'='DOCODE'
1268.9 001700 TOL: DW $+2
1268.10 001700 ELSE
1268.11 001700 .... TOL: DW DOCOLON
1268.12 001702 ENDIF
1268.13 001702 ENDM
1269 001702 ............* DW CELL,LP,PLUSSTORE,LP,FETCH,STORE,EXIT
1270 001710
1271 001710 ;Z L> -- x L: x -- move from leave
stack
1272 001710 ; LP @ @ CELL NEGATE LP +! ;
1273 001710 HEADER LFROM,2,'l>',DOCOLON
1273.1 000000 PUBLIC LFROM
1273.2 001710 .... DW link
1273.3 001712 FF DB 0FFh ; not immediate
1273.4 001713 link SET $
1273.5 001713 02 DB 2
1273.6 001714 6C3E DB 'l>'
1273.7 001716 EVEN
1273.8 001716 IF 'DOCOLON'='DOCODE'
1273.9 001716 LFROM: DW $+2
1273.10 001716 ELSE
1273.11 001716 .... LFROM: DW DOCOLON
1273.12 001718 ENDIF
1273.13 001718 ENDM
1274 001718 ............ DW LP,FETCH,FETCH
1275 00171E ............* DW CELL,NEGATE,LP,PLUSSTORE,EXIT
1276 001728
1277 001728 ;C DO -- adrs L: -- 0
1278 001728 ; ['] xdo ,XT IHERE target for bwd
branch
1279 001728 ; 0 >L ; IMMEDIATE marker for
LEAVEs
1280 001728 IMMED DO,2,'do',DOCOLON
1280.1 000000 PUBLIC DO
1280.2 001728 .... DW link
1280.3 00172A FE DB 0FEh // ; immediate
(LSB=0)
1280.4 00172B link SET $
1280.5 00172B 02 DB 2
1280.6 00172C 646F DB 'do'
1280.7 00172E EVEN
1280.8 00172E IF 'DOCOLON'='DOCODE'
1280.9 00172E DO: DW $+2
1280.10 00172E ELSE
1280.11 00172E .... DO: DW DOCOLON
1280.12 001730 ENDIF
1280.13 001730 ENDM
1281 001730 ............* DW lit,xdo,COMMAXT,IHERE
1282 001738 ....0000....* DW lit,0,TOL,EXIT
1283 001740
1284 001740 ;Z ENDLOOP adrs xt -- L: 0 a1 a2 .. aN
--
1285 001740 ; ,BRANCH ,DEST backward
loop
1286 001740 ; BEGIN L> ?DUP WHILE POSTPONE THEN REPEAT
;
1287 001740 ; resolve
LEAVEs
1288 001740 ; This is a common factor of LOOP and +LOOP.
1289 001740 HEADER ENDLOOP,7,'endloop',DOCOLON
1289.1 000000 PUBLIC ENDLOOP
1289.2 001740 .... DW link
1289.3 001742 FF DB 0FFh ; not immediate
1289.4 001743 link SET $
1289.5 001743 07 DB 7
1289.6 001744 656E646C6F6F* DB 'endloop'
1289.7 00174B 00 EVEN
1289.8 00174C IF 'DOCOLON'='DOCODE'
1289.9 00174C ENDLOOP: DW $+2
1289.10 00174C ELSE
1289.11 00174C .... ENDLOOP: DW DOCOLON
1289.12 00174E ENDIF
1289.13 00174E ENDM
1290 00174E ........ DW COMMABRANCH,COMMADEST
1291 001752 ............ LOOP1: DW LFROM,QDUP,qbran
1292 001758 DEST LOOP2
1292.1 001758 0800 DW LOOP2-$
1292.2 00175A ENDM
1293 00175A ........ DW THEN,bran
1294 00175E DEST LOOP1
1294.1 00175E F4FF DW LOOP1-$
1294.2 001760 ENDM
1295 001760 .... LOOP2: DW EXIT
1296 001762
1297 001762 ;C LOOP adrs -- L: 0 a1 a2 .. aN --
1298 001762 ; ['] xloop ENDLOOP ; IMMEDIATE
1299 001762 IMMED LOO,4,'loop',DOCOLON
1299.1 000000 PUBLIC LOO
1299.2 001762 .... DW link
1299.3 001764 FE DB 0FEh // ; immediate
(LSB=0)
1299.4 001765 link SET $
1299.5 001765 04 DB 4
1299.6 001766 6C6F6F70 DB 'loop'
1299.7 00176A EVEN
1299.8 00176A IF 'DOCOLON'='DOCODE'
1299.9 00176A LOO: DW $+2
1299.10 00176A ELSE
1299.11 00176A .... LOO: DW DOCOLON
1299.12 00176C ENDIF
1299.13 00176C ENDM
1300 00176C ............* DW lit,xloop,ENDLOOP,EXIT
1301 001774
1302 001774 ;C +LOOP adrs -- L: 0 a1 a2 .. aN --
1303 001774 ; ['] xplusloop ENDLOOP ; IMMEDIATE
1304 001774 IMMED PLUSLOOP,5,'+loop',DOCOLON
1304.1 000000 PUBLIC PLUSLOOP
1304.2 001774 .... DW link
1304.3 001776 FE DB 0FEh // ; immediate
(LSB=0)
1304.4 001777 link SET $
1304.5 001777 05 DB 5
1304.6 001778 2B6C6F6F70 DB '+loop'
1304.7 00177D 00 EVEN
1304.8 00177E IF 'DOCOLON'='DOCODE'
1304.9 00177E PLUSLOOP: DW $+2
1304.10 00177E ELSE
1304.11 00177E .... PLUSLOOP: DW DOCOLON
1304.12 001780 ENDIF
1304.13 001780 ENDM
1305 001780 ............* DW lit,xplusloop,ENDLOOP,EXIT
1306 001788
1307 001788 ;C LEAVE -- L: -- adrs
1308 001788 ; ['] UNLOOP ,XT
1309 001788 ; ['] branch ,BRANCH IHERE ,NONE >L
1310 001788 ; ; IMMEDIATE unconditional forward
branch
1311 001788 IMMED LEAV,5,'leave',DOCOLON
1311.1 000000 PUBLIC LEAV
1311.2 001788 .... DW link
1311.3 00178A FE DB 0FEh // ; immediate
(LSB=0)
1311.4 00178B link SET $
1311.5 00178B 05 DB 5
1311.6 00178C 6C65617665 DB 'leave'
1311.7 001791 00 EVEN
1311.8 001792 IF 'DOCOLON'='DOCODE'
1311.9 001792 LEAV: DW $+2
1311.10 001792 ELSE
1311.11 001792 .... LEAV: DW DOCOLON
1311.12 001794 ENDIF
1311.13 001794 ENDM
1312 001794 ............ DW lit,UNLOOP,COMMAXT
1313 00179A ............ DW lit,bran,COMMABRANCH
1314 0017A0 ............* DW IHERE,COMMANONE,TOL,EXIT
1315 0017A8
1316 0017A8 ; OTHER OPERATIONS =============================
=
1317 0017A8
1318 0017A8 ;X WITHIN n1|u1 n2|u2 n3|u3 -- f n2<=n1R - R> U< ; per ANS
document
1320 0017A8 HEADER WITHIN,6,'within',DOCOLON
1320.1 000000 PUBLIC WITHIN
1320.2 0017A8 .... DW link
1320.3 0017AA FF DB 0FFh ; not immediate
1320.4 0017AB link SET $
1320.5 0017AB 06 DB 6
1320.6 0017AC 77697468696E DB 'within'
1320.7 0017B2 EVEN
1320.8 0017B2 IF 'DOCOLON'='DOCODE'
1320.9 0017B2 WITHIN: DW $+2
1320.10 0017B2 ELSE
1320.11 0017B2 .... WITHIN: DW DOCOLON
1320.12 0017B4 ENDIF
1320.13 0017B4 ENDM
1321 0017B4 ............* DW OVER,MINUS,TOR,MINUS,RFROM,ULESS,EXIT
1322 0017C2
1323 0017C2 ;C MOVE addr1 addr2 u -- smart move
1324 0017C2 ; VERSION FOR 1 ADDRESS UNIT = 1
CHAR
1325 0017C2 ; >R 2DUP SWAP DUP R@ + -- ... dst src
src+n
1326 0017C2 ; WITHIN IF R> CMOVE> src <= dst <
src+n
1327 0017C2 ; ELSE R> CMOVE THEN ;
otherwise
1328 0017C2 HEADER MOVE,4,'move',DOCOLON
1328.1 000000 PUBLIC MOVE
1328.2 0017C2 .... DW link
1328.3 0017C4 FF DB 0FFh ; not immediate
1328.4 0017C5 link SET $
1328.5 0017C5 04 DB 4
1328.6 0017C6 6D6F7665 DB 'move'
1328.7 0017CA EVEN
1328.8 0017CA IF 'DOCOLON'='DOCODE'
1328.9 0017CA MOVE: DW $+2
1328.10 0017CA ELSE
1328.11 0017CA .... MOVE: DW DOCOLON
1328.12 0017CC ENDIF
1328.13 0017CC ENDM
1329 0017CC ............* DW TOR,TWODUP,SWAP,DUP,RFETCH,PLUS
1330 0017D8 ........ DW WITHIN,qbran
1331 0017DC DEST MOVE1
1331.1 0017DC 0A00 DW MOVE1-$
1331.2 0017DE ENDM
1332 0017DE ............ DW RFROM,CMOVEUP,bran
1333 0017E4 DEST MOVE2
1333.1 0017E4 0600 DW MOVE2-$
1333.2 0017E6 ENDM
1334 0017E6 ........ MOVE1: DW RFROM,CMOVE
1335 0017EA .... MOVE2: DW EXIT
1336 0017EC
1337 0017EC ;C DEPTH -- +n number of items on
stack
1338 0017EC ; SP@ S0 SWAP - 2/ ; 16-BIT VERSION!
1339 0017EC HEADER DEPTH,5,'depth',DOCOLON
1339.1 000000 PUBLIC DEPTH
1339.2 0017EC .... DW link
1339.3 0017EE FF DB 0FFh ; not immediate
1339.4 0017EF link SET $
1339.5 0017EF 05 DB 5
1339.6 0017F0 6465707468 DB 'depth'
1339.7 0017F5 00 EVEN
1339.8 0017F6 IF 'DOCOLON'='DOCODE'
1339.9 0017F6 DEPTH: DW $+2
1339.10 0017F6 ELSE
1339.11 0017F6 .... DEPTH: DW DOCOLON
1339.12 0017F8 ENDIF
1339.13 0017F8 ENDM
1340 0017F8 ............* DW SPFETCH,S0,SWAP,MINUS,TWOSLASH,EXIT
1341 001804
1342 001804 ;C ENVIRONMENT? c-addr u -- false system
query
1343 001804 ; -- i*x true
1344 001804 ; 2DROP 0 ; the minimal definition!
1345 001804 HEADER ENVIRONMENTQ,12,'environment?',DOCOL
ON
1345.1 000000 PUBLIC ENVIRONMENTQ
1345.2 001804 .... DW link
1345.3 001806 FF DB 0FFh ; not immediate
1345.4 001807 link SET $
1345.5 001807 0C DB 12
1345.6 001808 656E7669726F* DB 'environment?'
1345.7 001814 EVEN
1345.8 001814 IF 'DOCOLON'='DOCODE'
1345.9 001814 ENVIRONMENTQ: DW $+2
1345.10 001814 ELSE
1345.11 001814 .... ENVIRONMENTQ: DW DOCOLON
1345.12 001816 ENDIF
1345.13 001816 ENDM
1346 001816 ........0000* DW TWODROP,lit,0,EXIT
1347 00181E
1348 00181E ;U UTILITY WORDS =====================
1349 00181E
1350 00181E ;Z NOOP -- do nothing
1351 00181E HEADER NOOP,4,'noop',DOCOLON
1351.1 000000 PUBLIC NOOP
1351.2 00181E .... DW link
1351.3 001820 FF DB 0FFh ; not immediate
1351.4 001821 link SET $
1351.5 001821 04 DB 4
1351.6 001822 6E6F6F70 DB 'noop'
1351.7 001826 EVEN
1351.8 001826 IF 'DOCOLON'='DOCODE'
1351.9 001826 NOOP: DW $+2
1351.10 001826 ELSE
1351.11 001826 .... NOOP: DW DOCOLON
1351.12 001828 ENDIF
1351.13 001828 ENDM
1352 001828 .... DW EXIT
1353 00182A
1354 00182A ;Z FLALIGNED a -- a' align IDP to flash
boundary
1355 00182A ; $200 OVER - $1FF AND + ;
1356 00182A HEADER FLALIGNED,9,'flaligned',DOCOLON
1356.1 000000 PUBLIC FLALIGNED
1356.2 00182A .... DW link
1356.3 00182C FF DB 0FFh ; not immediate
1356.4 00182D link SET $
1356.5 00182D 09 DB 9
1356.6 00182E 666C616C6967* DB 'flaligned'
1356.7 001837 00 EVEN
1356.8 001838 IF 'DOCOLON'='DOCODE'
1356.9 001838 FLALIGNED: DW $+2
1356.10 001838 ELSE
1356.11 001838 .... FLALIGNED: DW DOCOLON
1356.12 00183A ENDIF
1356.13 00183A ENDM
1357 00183A ....0002....* DW lit,0200h,OVER,MINUS,lit,01FFh,ANDD,P
LUS,EXIT
1358 00184C
1359 00184C ;X MARKER -- create word to restore
dictionary
1360 00184C ; LATEST @ IHERE HERE
1361 00184C ; IHERE FLALIGNED IDP ! align new word to
flash boundary
1362 00184C ; DUP I@
1364 00184C ; SWAP CELL+ DUP I@
1365 00184C ; SWAP CELL+ I@ fetch saved -- dp
idp latest
1366 00184C ; OVER FLALIGNED IHERE OVER - FLERASE erase
Flash from saved to IHERE
1367 00184C ; LATEST ! IDP ! DP ! ;
1368 00184C HEADER MARKER,6,'marker',DOCOLON
1368.1 000000 PUBLIC MARKER
1368.2 00184C .... DW link
1368.3 00184E FF DB 0FFh ; not immediate
1368.4 00184F link SET $
1368.5 00184F 06 DB 6
1368.6 001850 6D61726B6572 DB 'marker'
1368.7 001856 EVEN
1368.8 001856 IF 'DOCOLON'='DOCODE'
1368.9 001856 MARKER: DW $+2
1368.10 001856 ELSE
1368.11 001856 .... MARKER: DW DOCOLON
1368.12 001858 ENDIF
1368.13 001858 ENDM
1369 001858 ............* DW LATEST,FETCH,IHERE,HERE
1370 001860 ............* DW IHERE,FLALIGNED,IDP,STORE
1371 001868 ............* DW BUILDS,ICOMMA,ICOMMA,ICOMMA,XDOES
1372 001872 3040.... MOV #dodoes,PC ; long direct jump
to DODOES
1373 001876 ........ DW DUP,IFETCH
1374 00187A ............* DW SWAP,CELLPLUS,DUP,IFETCH
1375 001882 ............ DW SWAP,CELLPLUS,IFETCH
1376 001888 ............* DW OVER,FLALIGNED,IHERE,OVER,MINUS,FLERA
SE
1377 001894 ............* DW LATEST,STORE,IDP,STORE,DDP,STORE,EXIT
1378 0018A2
1379 0018A2 ;X WORDS -- list all words in
dict.
1380 0018A2 ; LATEST @ BEGIN
1381 0018A2 ; DUP HCOUNT 7F AND HTYPE SPACE
1382 0018A2 ; NFA>LFA H@
1383 0018A2 ; DUP 0= UNTIL
1384 0018A2 ; DROP ;
1385 0018A2 HEADER WORDS,5,'words',DOCOLON
1385.1 000000 PUBLIC WORDS
1385.2 0018A2 .... DW link
1385.3 0018A4 FF DB 0FFh ; not immediate
1385.4 0018A5 link SET $
1385.5 0018A5 05 DB 5
1385.6 0018A6 776F726473 DB 'words'
1385.7 0018AB 00 EVEN
1385.8 0018AC IF 'DOCOLON'='DOCODE'
1385.9 0018AC WORDS: DW $+2
1385.10 0018AC ELSE
1385.11 0018AC .... WORDS: DW DOCOLON
1385.12 0018AE ENDIF
1385.13 0018AE ENDM
1386 0018AE ........ DW LATEST,FETCH
1387 0018B2 ;WDS1: DW DUP,HCOUNT,lit,07FH,ANDD,HTYPE,SPACE
1388 0018B2 ............*WDS1: DW DUP,HCOUNT,lit,07FH,ANDD,HTYPE,CR
1389 0018C0 ........ DW NFATOLFA,HFETCH
1390 0018C4 ............ DW DUP,ZEROEQUAL,qbran
1391 0018CA DEST WDS1
1391.1 0018CA E8FF DW WDS1-$
1391.2 0018CC ENDM
1392 0018CC ........ DW DROP,EXIT
1393 0018D0
1394 0018D0 ;X U.R u n -- display u unsigned in
n width
1395 0018D0 ; >R <# 0 #S #> R> OVER - 0 MAX SPACES TYPE
;
1396 0018D0 HEADER UDOTR,3,'u.r',DOCOLON
1396.1 000000 PUBLIC UDOTR
1396.2 0018D0 .... DW link
1396.3 0018D2 FF DB 0FFh ; not immediate
1396.4 0018D3 link SET $
1396.5 0018D3 03 DB 3
1396.6 0018D4 752E72 DB 'u.r'
1396.7 0018D7 00 EVEN
1396.8 0018D8 IF 'DOCOLON'='DOCODE'
1396.9 0018D8 UDOTR: DW $+2
1396.10 0018D8 ELSE
1396.11 0018D8 .... UDOTR: DW DOCOLON
1396.12 0018DA ENDIF
1396.13 0018DA ENDM
1397 0018DA ............* DW TOR,LESSNUM,lit,0,NUMS,NUMGREATER
1398 0018E6 ............* DW RFROM,OVER,MINUS,lit,0,MAX,SPACES,TYP
,EXIT
1399 0018F8
1400 0018F8 ;X DUMP adr n -- dump memory
1401 0018F8 ; OVER + SWAP DO
1402 0018F8 ; CR I 4 U.R SPACE SPACE
1403 0018F8 ; I $10 + I DO I C@ 3 U.R LOOP SPACE
SPACE
1404 0018F8 ; I $10 + I DO I C@ $7F AND $7E MIN BL MAX
EMIT LOOP
1405 0018F8 ; 10 +LOOP ;
1406 0018F8 HEADER DUMP,4,'dump',DOCOLON
1406.1 000000 PUBLIC DUMP
1406.2 0018F8 .... DW link
1406.3 0018FA FF DB 0FFh ; not immediate
1406.4 0018FB link SET $
1406.5 0018FB 04 DB 4
1406.6 0018FC 64756D70 DB 'dump'
1406.7 001900 EVEN
1406.8 001900 IF 'DOCOLON'='DOCODE'
1406.9 001900 DUMP: DW $+2
1406.10 001900 ELSE
1406.11 001900 .... DUMP: DW DOCOLON
1406.12 001902 ENDIF
1406.13 001902 ENDM
1407 001902 ............* DW OVER,PLUS,SWAP,xdo
1408 00190A ............*LDUMP1: DW CR,II,lit,4,UDOTR,SPACE,SPACE
1409 001918 ........1000* DW II,lit,10h,PLUS,II,xdo
1410 001924 ............*LDUMP2: DW II,CFETCH,lit,3,UDOTR,xloop
1411 001930 DEST LDUMP2
1411.1 001930 F4FF DW LDUMP2-$
1411.2 001932 ENDM
1412 001932 ........ DW SPACE,SPACE
1413 001936 ........1000* DW II,lit,10h,PLUS,II,xdo
1414 001942 ............*LDUMP3: DW II,CFETCH,lit,7Fh,ANDD,lit,7Eh,MIN,BL
ANK,MAX,EMIT,xloop
1415 00195A DEST LDUMP3
1415.1 00195A E8FF DW LDUMP3-$
1415.2 00195C ENDM
1416 00195C ....1000.... DW lit,10h,xplusloop
1417 001962 DEST LDUMP1
1417.1 001962 A8FF DW LDUMP1-$
1417.2 001964 ENDM
1418 001964 .... DW EXIT
1419 001966
1420 001966 ;X .S -- print stack contents
1421 001966 ; [char] < EMIT DEPTH . BS [char] > EMIT
1422 001966 ; SP@ S0 < IF
1423 001966 ; SP@ S0 2 - DO I @ U. -2 +LOOP
1424 001966 ; THEN ;
1425 001966 HEADER DOTS,2,'.s',DOCOLON
1425.1 000000 PUBLIC DOTS
1425.2 001966 .... DW link
1425.3 001968 FF DB 0FFh ; not immediate
1425.4 001969 link SET $
1425.5 001969 02 DB 2
1425.6 00196A 2E73 DB '.s'
1425.7 00196C EVEN
1425.8 00196C IF 'DOCOLON'='DOCODE'
1425.9 00196C DOTS: DW $+2
1425.10 00196C ELSE
1425.11 00196C .... DOTS: DW DOCOLON
1425.12 00196E ENDIF
1425.13 00196E ENDM
1426 00196E ;mk gforth style
1427 00196E ....3C00.... DW lit,$3C,EMIT
1428 001974 ........ DW DEPTH,DOT
1429 001978 ....0800....* DW lit,$08,EMIT,lit,$3E,EMIT,SPACE
1430 001986 ;/mk
1431 001986 ............* DW SPFETCH,S0,LESS,qbran
1432 00198E DEST DOTS2
1432.1 00198E 1C00 DW DOTS2-$
1432.2 001990 ENDM
1433 001990 ............* DW SPFETCH,S0,lit,2,MINUS,xdo
1434 00199C ............*DOTS1: DW II,FETCH,UDOT,lit,-2,xplusloop
1435 0019A8 DEST DOTS1
1435.1 0019A8 F4FF DW DOTS1-$
1435.2 0019AA ENDM
1436 0019AA .... DOTS2: DW EXIT
1437 0019AC
1438 0019AC
1439 0019AC ;U ccrc n c -- n' crc process
byte
1440 0019AC ; 8 LSHIFT XOR
1441 0019AC ; 8 0 DO ( n' )
1442 0019AC ; DUP 1 LSHIFT SWAP 8000 AND 0= INVERT 1021
( CRC-16 ) AND XOR
1443 0019AC ; LOOP
1444 0019AC ; FFFF AND ;
1445 0019AC HEADER CCRC,4,'ccrc',DOCOLON
1445.1 000000 PUBLIC CCRC
1445.2 0019AC .... DW link
1445.3 0019AE FF DB 0FFh ; not immediate
1445.4 0019AF link SET $
1445.5 0019AF 04 DB 4
1445.6 0019B0 63637263 DB 'ccrc'
1445.7 0019B4 EVEN
1445.8 0019B4 IF 'DOCOLON'='DOCODE'
1445.9 0019B4 CCRC: DW $+2
1445.10 0019B4 ELSE
1445.11 0019B4 .... CCRC: DW DOCOLON
1445.12 0019B6 ENDIF
1445.13 0019B6 ENDM
1446 0019B6 ....0800....* DW lit,8,LSHIFT,XORR
1447 0019BE ....0800....* DW lit,8,lit,0,xdo
1448 0019C8 ........0100*ccrc1: DW DUP,lit,1,LSHIFT,SWAP,lit,08000h,AN
DD,ZEROEQUAL
1449 0019DA ........2110* DW INVERT,lit,01021h,ANDD,XORR
1450 0019E4 .... DW xloop
1451 0019E6 DEST ccrc1
1451.1 0019E6 E2FF DW ccrc1-$
1451.2 0019E8 ENDM
1452 0019E8 .... DW EXIT
1453 0019EA
1454 0019EA ;U (crc n addr len -- n' crc process
string
1455 0019EA ; dup IF over + swap DO ( n ) I C@ ccrc LOOP
ELSE 2drop THEN ;
1456 0019EA HEADER PCRC,4,'(crc',DOCOLON
1456.1 000000 PUBLIC PCRC
1456.2 0019EA .... DW link
1456.3 0019EC FF DB 0FFh ; not immediate
1456.4 0019ED link SET $
1456.5 0019ED 04 DB 4
1456.6 0019EE 28637263 DB '(crc'
1456.7 0019F2 EVEN
1456.8 0019F2 IF 'DOCOLON'='DOCODE'
1456.9 0019F2 PCRC: DW $+2
1456.10 0019F2 ELSE
1456.11 0019F2 .... PCRC: DW DOCOLON
1456.12 0019F4 ENDIF
1456.13 0019F4 ENDM
1457 0019F4 ........ DW DUP,qbran
1458 0019F8 DEST pcrc2
1458.1 0019F8 1800 DW pcrc2-$
1458.2 0019FA ENDM
1459 0019FA ............* DW OVER,PLUS,SWAP,xdo
1460 001A02 ............*pcrc1: DW II,CFETCH,CCRC, xloop
1461 001A0A DEST pcrc1
1461.1 001A0A F8FF DW pcrc1-$
1461.2 001A0C ENDM
1462 001A0C .... DW bran
1463 001A0E DEST pcrc3
1463.1 001A0E 0400 DW pcrc3-$
1463.2 001A10 ENDM
1464 001A10 .... pcrc2: DW TWODROP
1465 001A12 .... pcrc3: DW EXIT
1466 001A14
1467 001A14 ;U crc addr len -- n
1468 001A14 HEADER CRC,3,'crc',DOCOLON
1468.1 000000 PUBLIC CRC
1468.2 001A14 .... DW link
1468.3 001A16 FF DB 0FFh ; not immediate
1468.4 001A17 link SET $
1468.5 001A17 03 DB 3
1468.6 001A18 637263 DB 'crc'
1468.7 001A1B 00 EVEN
1468.8 001A1C IF 'DOCOLON'='DOCODE'
1468.9 001A1C CRC: DW $+2
1468.10 001A1C ELSE
1468.11 001A1C .... CRC: DW DOCOLON
1468.12 001A1E ENDIF
1468.13 001A1E ENDM
1469 001A1E ....0000....* DW lit,0,ROT,ROT,PCRC,EXIT
1470 001A2A
1471 001A2A
1472 001A2A ;U STARTUP WORDS =====================
1473 001A2A
1474 001A2A ;Z ITHERE -- adr find first free flash
cell
1475 001A2A ; MEMTOP BEGIN 1-
1476 001A2A ; DUP C@ FF <>
1477 001A2A ; OVER FL0 < OR UNTIL 1+ ;
1478 001A2A HEADER ITHERE,6,'ithere',DOCOLON
1478.1 000000 PUBLIC ITHERE
1478.2 001A2A .... DW link
1478.3 001A2C FF DB 0FFh ; not immediate
1478.4 001A2D link SET $
1478.5 001A2D 06 DB 6
1478.6 001A2E 697468657265 DB 'ithere'
1478.7 001A34 EVEN
1478.8 001A34 IF 'DOCOLON'='DOCODE'
1478.9 001A34 ITHERE: DW $+2
1478.10 001A34 ELSE
1478.11 001A34 .... ITHERE: DW DOCOLON
1478.12 001A36 ENDIF
1478.13 001A36 ENDM
1479 001A36 .... DW MEMTOP
1480 001A38 ............*ih1 DW ONEMINUS,DUP,CFETCH,lit,$FF,NOTEQUAL
1481 001A44 ............* DW OVER,MEMBOT,LESS,ORR,qbran
1482 001A4E DEST ih1
1482.1 001A4E EAFF DW ih1-$
1482.2 001A50 ENDM
1483 001A50 ........ DW ONEPLUS,EXIT
1484 001A54
1485 001A54 ;U APPCRC -- crc CRC of APP-dictionary
1486 001A54 ; 0 MEMBOT ITHERE OVER - (crc APPU0 #INIT
(crc ;
1487 001A54 HEADER APPCRC,6,'appcrc',DOCOLON
1487.1 000000 PUBLIC APPCRC
1487.2 001A54 .... DW link
1487.3 001A56 FF DB 0FFh ; not immediate
1487.4 001A57 link SET $
1487.5 001A57 06 DB 6
1487.6 001A58 617070637263 DB 'appcrc'
1487.7 001A5E EVEN
1487.8 001A5E IF 'DOCOLON'='DOCODE'
1487.9 001A5E APPCRC: DW $+2
1487.10 001A5E ELSE
1487.11 001A5E .... APPCRC: DW DOCOLON
1487.12 001A60 ENDIF
1487.13 001A60 ENDM
1488 001A60 ....0000 DW lit,0
1489 001A64 ............* DW MEMBOT,ITHERE,OVER,MINUS,PCRC
1490 001A6E ............* DW APPU0,NINIT,PCRC,EXIT
1491 001A76
1492 000000 EXTERN crcval
1493 001A76
1494 001A76 ;U VALID? -- f check if user app crc
matches infoB
1495 001A76 ; APPCRC crcval I@ = ;
1496 001A76 HEADER VALIDQ,6,'valid?',DOCOLON
1496.1 000000 PUBLIC VALIDQ
1496.2 001A76 .... DW link
1496.3 001A78 FF DB 0FFh ; not immediate
1496.4 001A79 link SET $
1496.5 001A79 06 DB 6
1496.6 001A7A 76616C69643F DB 'valid?'
1496.7 001A80 EVEN
1496.8 001A80 IF 'DOCOLON'='DOCODE'
1496.9 001A80 VALIDQ: DW $+2
1496.10 001A80 ELSE
1496.11 001A80 .... VALIDQ: DW DOCOLON
1496.12 001A82 ENDIF
1496.13 001A82 ENDM
1497 001A82 ............* DW APPCRC,lit,crcval,IFETCH,EQUAL,EXIT
1498 001A8E
1499 001A8E ;U SAVE -- save user area to infoB
1500 001A8E ; InfoB [ 63 2 + ] Literal FLERASE
1501 001A8E ; U0 APPU0 #INIT D->I
1502 001A8E ; APPCRC [ crcval ] Literal I! ;
1503 001A8E HEADER SAVE,4,'save',DOCOLON
1503.1 000000 PUBLIC SAVE
1503.2 001A8E .... DW link
1503.3 001A90 FF DB 0FFh ; not immediate
1503.4 001A91 link SET $
1503.5 001A91 04 DB 4
1503.6 001A92 73617665 DB 'save'
1503.7 001A96 EVEN
1503.8 001A96 IF 'DOCOLON'='DOCODE'
1503.9 001A96 SAVE: DW $+2
1503.10 001A96 ELSE
1503.11 001A96 .... SAVE: DW DOCOLON
1503.12 001A98 ENDIF
1503.13 001A98 ENDM
1504 001A98 ........4100* DW INFOB,lit,63+2,FLERASE
1505 001AA0 ............* DW U0,APPU0,NINIT,DTOI
1506 001AA8 ............* DW APPCRC,lit,crcval,ISTORE
1507 001AB0 .... DW EXIT
1508 001AB2
1509 00018E CORREST EQU 018Eh
1510 000186 CORPOWERON EQU 0186h
1511 001AB2
1512 001AB2 ;Z BOOT -- boot system
1513 001AB2 HEADER BOOT,4,'boot',DOCOLON
1513.1 000000 PUBLIC BOOT
1513.2 001AB2 .... DW link
1513.3 001AB4 FF DB 0FFh ; not immediate
1513.4 001AB5 link SET $
1513.5 001AB5 04 DB 4
1513.6 001AB6 626F6F74 DB 'boot'
1513.7 001ABA EVEN
1513.8 001ABA IF 'DOCOLON'='DOCODE'
1513.9 001ABA BOOT: DW $+2
1513.10 001ABA ELSE
1513.11 001ABA .... BOOT: DW DOCOLON
1513.12 001ABC ENDIF
1513.13 001ABC ENDM
1514 001ABC .... DW DOTVER
1515 001ABE ............ DW S2,cget,qbran
1516 001AC4 DEST boot1
1516.1 001AC4 2800 DW boot1-$
1516.2 001AC6 ENDM
1517 001AC6 ........ DW VALIDQ,qbran
1518 001ACA DEST invalid
1518.1 001ACA 0400 DW invalid-$
1518.2 001ACC ENDM
1519 001ACC .... valid: DW COLD ; valid infoB and dictionary
1520 001ACE ............*invalid:DW COR,FETCH,lit,CORPOWERON,NOTEQUAL,qbr
an
1521 001ADA DEST boot1
1521.1 001ADA 1200 DW boot1-$
1521.2 001ADC ENDM
1522 001ADC reset: ; reset and invalid infoB
1523 001ADC ............* DW LATEST,FETCH,MEMBOT,ITHERE,WITHIN,qbr
an ; check RAM latest
1524 001AE8 DEST boot1
1524.1 001AE8 0400 DW boot1-$
1524.2 001AEA ENDM
1525 001AEA .... DW WARM ; invalid infoB but seemingly
valid RAM
1526 001AEC .... boot1: DW WIPE ; invalid infoB but power on
or RAM invalid
1527 001AEE
1528 000000 PUBLIC BOOTIP ; used to init IP register.
1529 001AEE BOOTIP equ BOOT+2
1530 001AEE
1531 001AEE ;Z WARM -- use user area from RAM
(hopefully intact)
1532 001AEE HEADER WARM,4,'warm',DOCOLON
1532.1 000000 PUBLIC WARM
1532.2 001AEE .... DW link
1532.3 001AF0 FF DB 0FFh ; not immediate
1532.4 001AF1 link SET $
1532.5 001AF1 04 DB 4
1532.6 001AF2 7761726D DB 'warm'
1532.7 001AF6 EVEN
1532.8 001AF6 IF 'DOCOLON'='DOCODE'
1532.9 001AF6 WARM: DW $+2
1532.10 001AF6 ELSE
1532.11 001AF6 .... WARM: DW DOCOLON
1532.12 001AF8 ENDIF
1532.13 001AF8 ENDM
1533 001AF8 .... DW XISQUOTE
1534 001AFA 05 DB (warm1-warm0)
1535 001AFB 5761726D warm0: DB 'Warm'
1536 001AFF 00 EVEN
1537 001B00 .... warm1: DW ITYPE
1538 001B02 .... DW ABORT
1539 001B04
1540 001B04 ;U .COLD -- display COLD message
1541 001B04 HEADLESS DOTCOLD,DOCOLON
1541.1 000000 PUBLIC DOTCOLD
1541.2 001B04 IF 'DOCOLON'='DOCODE'
1541.3 001B04 DOTCOLD: DW $+2
1541.4 001B04 ELSE
1541.5 001B04 .... DOTCOLD: DW DOCOLON
1541.6 001B06 ENDIF
1541.7 001B06 ENDM
1542 001B06 .... DW XISQUOTE
1543 001B08 05 DB (dotcold1-dotcold0)
1544 001B09 436F6C64 dotcold0:DB 'Cold'
1545 001B0D 00 EVEN
1546 001B0E .... dotcold1:DW ITYPE
1547 001B10 .... DW EXIT
1548 001B12
1549 001B12 PUBLIC DOTCOLD
1550 001B12
1551 001B12 ;Z COLD -- set user area to latest
application
1552 001B12 HEADER COLD,4,'cold',DOCOLON
1552.1 000000 PUBLIC COLD
1552.2 001B12 .... DW link
1552.3 001B14 FF DB 0FFh ; not immediate
1552.4 001B15 link SET $
1552.5 001B15 04 DB 4
1552.6 001B16 636F6C64 DB 'cold'
1552.7 001B1A EVEN
1552.8 001B1A IF 'DOCOLON'='DOCODE'
1552.9 001B1A COLD: DW $+2
1552.10 001B1A ELSE
1552.11 001B1A .... COLD: DW DOCOLON
1552.12 001B1C ENDIF
1552.13 001B1C ENDM
1553 001B1C ............* DW APPU0,U0,NINIT,ITOD ; use application
user area
1554 001B24 ............ DW APP,FETCH,EXECUTE ; AUTOSTART
Application
1555 001B2A .... DW ABORT
1556 001B2C
1557 001B2C ;Z FACTORY -- set user area to delivery
condition
1558 001B2C ; UINIT U0 #INIT I->D SAVE init user
area
1559 001B2C ; ABORT ;
1560 001B2C HEADER FACTORY,7,'factory',DOCOLON
1560.1 000000 PUBLIC FACTORY
1560.2 001B2C .... DW link
1560.3 001B2E FF DB 0FFh ; not immediate
1560.4 001B2F link SET $
1560.5 001B2F 07 DB 7
1560.6 001B30 666163746F72* DB 'factory'
1560.7 001B37 00 EVEN
1560.8 001B38 IF 'DOCOLON'='DOCODE'
1560.9 001B38 FACTORY: DW $+2
1560.10 001B38 ELSE
1560.11 001B38 .... FACTORY: DW DOCOLON
1560.12 001B3A ENDIF
1560.13 001B3A ENDM
1561 001B3A ............* DW UINIT,U0,NINIT,ITOD ; use kernel
user
area
1562 001B42 .... DW SAVE
1563 001B44 .... DW ABORT ; ABORT never returns
1564 001B46
1565 000000 PUBLIC FACTORYIP ; used to init IP register.
1566 001B46 FACTORYIP equ FACTORY+2
1567 001B46
1568 001B46 ;U WIPE -- erase flash but not kernel,
reset user area.
1569 001B46 HEADER WIPE,4,'wipe',DOCOLON
1569.1 000000 PUBLIC WIPE
1569.2 001B46 .... DW link
1569.3 001B48 FF DB 0FFh ; not immediate
1569.4 001B49 link SET $
1569.5 001B49 04 DB 4
1569.6 001B4A 77697065 DB 'wipe'
1569.7 001B4E EVEN
1569.8 001B4E IF 'DOCOLON'='DOCODE'
1569.9 001B4E WIPE: DW $+2
1569.10 001B4E ELSE
1569.11 001B4E .... WIPE: DW DOCOLON
1569.12 001B50 ENDIF
1569.13 001B50 ENDM
1570 001B50 .... DW XISQUOTE
1571 001B52 07 DB (wipmsg1-wipmsg0)
1572 001B53 576970696E67 wipmsg0:DB 'Wiping'
1573 001B59 00 EVEN
1574 001B5A .... wipmsg1:DW ITYPE
1575 001B5C ........0020* DW MEMBOT,lit,FLASHEND-FLASHSTART+1,FLER
ASE
1576 001B64 .... DW FACTORY ; EXIT
1577 001B66
1578 001B66 ;U MISC ========================================
====================
1579 001B66
1580 001B66 ;C 2CONSTANT -- define a Forth
double constant
1581 001B66 ; (machine code fragment)
1583 001B66 ; Note that the constant is stored in Code
space.
1584 001B66 HEADER TWOCONSTANT,9,'2constant',DOCOLON
1584.1 000000 PUBLIC TWOCONSTANT
1584.2 001B66 .... DW link
1584.3 001B68 FF DB 0FFh ; not immediate
1584.4 001B69 link SET $
1584.5 001B69 09 DB 9
1584.6 001B6A 32636F6E7374* DB '2constant'
1584.7 001B73 00 EVEN
1584.8 001B74 IF 'DOCOLON'='DOCODE'
1584.9 001B74 TWOCONSTANT: DW $+2
1584.10 001B74 ELSE
1584.11 001B74 .... TWOCONSTANT: DW DOCOLON
1584.12 001B76 ENDIF
1584.13 001B76 ENDM
1585 001B76 ............* DW BUILDS,ICOMMA,ICOMMA,XDOES
1586 000000 PUBLIC DOTWOCON
1587 001B7E DOTWOCON: ; ( -- w1 w2 )
1588 001B7E 2482 SUB #4,PSP ; make room on stack
1589 001B80 84470200 MOV TOS,2(PSP)
1590 001B84 3746 MOV @W+,TOS ; fetch from parameter
field to TOS
1591 001B86 A4460000 MOV @W,0(PSP) ; fetch secon word from
parameter field to
NOS
1592 001B8A NEXT
1592.1 001B8A 3645 MOV @IP+,W // ; fetch word address
into W
1592.2 001B8C 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
1592.3 001B8E ENDM
1593 001B8E
1594 001B8E ;U \ -- backslash
1595 001B8E ; everything up to the end of the current line
is a comment.
1596 001B8E ; SOURCE >IN ! DROP ;
1597 001B8E IMMED BACKSLASH,1,'\\',DOCOLON
1597.1 000000 PUBLIC BACKSLASH
1597.2 001B8E .... DW link
1597.3 001B90 FE DB 0FEh // ; immediate
(LSB=0)
1597.4 001B91 link SET $
1597.5 001B91 01 DB 1
1597.6 001B92 5C DB '\\'
1597.7 001B93 00 EVEN
1597.8 001B94 IF 'DOCOLON'='DOCODE'
1597.9 001B94 BACKSLASH: DW $+2
1597.10 001B94 ELSE
1597.11 001B94 .... BACKSLASH: DW DOCOLON
1597.12 001B96 ENDIF
1597.13 001B96 ENDM
1598 001B96 ............* DW SOURCE,TOIN,STORE,DROP,EXIT
1599 001BA0
1600 001BA0 ;Z .VER -- type message
1601 001BA0 HEADER DOTVER,4,'.ver',DOCOLON
1601.1 000000 PUBLIC DOTVER
1601.2 001BA0 .... DW link
1601.3 001BA2 FF DB 0FFh ; not immediate
1601.4 001BA3 link SET $
1601.5 001BA3 04 DB 4
1601.6 001BA4 2E766572 DB '.ver'
1601.7 001BA8 EVEN
1601.8 001BA8 IF 'DOCOLON'='DOCODE'
1601.9 001BA8 DOTVER: DW $+2
1601.10 001BA8 ELSE
1601.11 001BA8 .... DOTVER: DW DOCOLON
1601.12 001BAA ENDIF
1601.13 001BAA ENDM
1602 001BAA ; DW lit,version,COUNT,ITYPE
1603 001BAA ............* DW lit,version,COUNT,TYP
1604 001BB2 ............ DW BASE,FETCH,BIN
1605 001BB8 ............ DW COR,FETCH,DOT ; print cause of
reset
1606 001BBE ........ DW BASE,STORE
1607 001BC2 .... DW EXIT
1608 001BC4
1609 001BC4 ;U BELL -- send $07 to
Terminal
1610 001BC4 HEADER BELL,4,'bell',DOCOLON
1610.1 000000 PUBLIC BELL
1610.2 001BC4 .... DW link
1610.3 001BC6 FF DB 0FFh ; not immediate
1610.4 001BC7 link SET $
1610.5 001BC7 04 DB 4
1610.6 001BC8 62656C6C DB 'bell'
1610.7 001BCC EVEN
1610.8 001BCC IF 'DOCOLON'='DOCODE'
1610.9 001BCC BELL: DW $+2
1610.10 001BCC ELSE
1610.11 001BCC .... BELL: DW DOCOLON
1610.12 001BCE ENDIF
1610.13 001BCE ENDM
1611 001BCE ....0700....* DW lit,7,EMIT,EXIT
1612 001BD6
1613 001BD6 ;U BIN -- set number base to
binary
1614 001BD6 HEADER BIN,3,'bin',DOCOLON
1614.1 000000 PUBLIC BIN
1614.2 001BD6 .... DW link
1614.3 001BD8 FF DB 0FFh ; not immediate
1614.4 001BD9 link SET $
1614.5 001BD9 03 DB 3
1614.6 001BDA 62696E DB 'bin'
1614.7 001BDD 00 EVEN
1614.8 001BDE IF 'DOCOLON'='DOCODE'
1614.9 001BDE BIN: DW $+2
1614.10 001BDE ELSE
1614.11 001BDE .... BIN: DW DOCOLON
1614.12 001BE0 ENDIF
1614.13 001BE0 ENDM
1615 001BE0 ....0200....* DW lit,2,BASE,STORE,EXIT
1616 001BEA
1617 001BEA
1618 001BEA
1619 001BEA ;U MCU specific words ==========================
================================
1620 001BEA
1621 001BEA ;U 1MS -- wait about 1 millisecond
1622 001BEA ; xx 0 DO yy 0 DO LOOP LOOP ; adjust xx and yy
to get a msec.
1623 001BEA HEADER ONEMS,3,'1ms',DOCOLON
1623.1 000000 PUBLIC ONEMS
1623.2 001BEA .... DW link
1623.3 001BEC FF DB 0FFh ; not immediate
1623.4 001BED link SET $
1623.5 001BED 03 DB 3
1623.6 001BEE 316D73 DB '1ms'
1623.7 001BF1 00 EVEN
1623.8 001BF2 IF 'DOCOLON'='DOCODE'
1623.9 001BF2 ONEMS: DW $+2
1623.10 001BF2 ELSE
1623.11 001BF2 .... ONEMS: DW DOCOLON
1623.12 001BF4 ENDIF
1623.13 001BF4 ENDM
1624 001BF4 ....2900....* DW lit,41,lit,0,xdo
1625 001BFE ....0B00....*onems1: DW lit,11,lit,0,xdo
1626 001C08 .... onems2: DW xloop
1627 001C0A DEST onems2
1627.1 001C0A FEFF DW onems2-$
1627.2 001C0C ENDM
1628 001C0C .... DW xloop
1629 001C0E DEST onems1
1629.1 001C0E F0FF DW onems1-$
1629.2 001C10 ENDM
1630 001C10 .... DW EXIT
1631 001C12
1632 001C12 ;U MS n -- wait about n
milliseconds
1633 001C12 ; 0 DO 1MS LOOP ;
1634 001C12 HEADER MS,2,'ms',DOCOLON
1634.1 000000 PUBLIC MS
1634.2 001C12 .... DW link
1634.3 001C14 FF DB 0FFh ; not immediate
1634.4 001C15 link SET $
1634.5 001C15 02 DB 2
1634.6 001C16 6D73 DB 'ms'
1634.7 001C18 EVEN
1634.8 001C18 IF 'DOCOLON'='DOCODE'
1634.9 001C18 MS: DW $+2
1634.10 001C18 ELSE
1634.11 001C18 .... MS: DW DOCOLON
1634.12 001C1A ENDIF
1634.13 001C1A ENDM
1635 001C1A ....0000.... DW lit,0,xdo
1636 001C20 ........ ms1: DW ONEMS,xloop
1637 001C24 DEST ms1
1637.1 001C24 FCFF DW ms1-$
1637.2 001C26 ENDM
1638 001C26 .... DW EXIT
1639 001C28
1640 001C28 ;U f_cpu -- u DCO in Khz
1641 001C28 HEADER F_CPU,5,'f_cpu',DOCON
1641.1 000000 PUBLIC F_CPU
1641.2 001C28 .... DW link
1641.3 001C2A FF DB 0FFh ; not immediate
1641.4 001C2B link SET $
1641.5 001C2B 05 DB 5
1641.6 001C2C 665F637075 DB 'f_cpu'
1641.7 001C31 00 EVEN
1641.8 001C32 IF 'DOCON'='DOCODE'
1641.9 001C32 F_CPU: DW $+2
1641.10 001C32 ELSE
1641.11 001C32 .... F_CPU: DW DOCON
1641.12 001C34 ENDIF
1641.13 001C34 ENDM
1642 001C34 401F DW fcpu
1643 001C36
1644 001C36 ;U Bit manipulation words ----------------------
--------------------------------
1645 001C36 ;U based on http://www.forth.org/svfig/Len/bits.
htm
1646 001C36
1647 001C36 ;U CSET mask addr -- set bit from mask
in addr
1648 001C36 HEADER cset,4,'cset',DOCODE
1648.1 000000 PUBLIC cset
1648.2 001C36 .... DW link
1648.3 001C38 FF DB 0FFh ; not immediate
1648.4 001C39 link SET $
1648.5 001C39 04 DB 4
1648.6 001C3A 63736574 DB 'cset'
1648.7 001C3E EVEN
1648.8 001C3E IF 'DOCODE'='DOCODE'
1648.9 001C3E .... cset: DW $+2
1648.10 001C40 ELSE
1648.11 001C40 cset: DW DOCODE
1648.12 001C40 ENDIF
1648.13 001C40 ENDM
1649 001C40 E7D40000 BIS.B @PSP,0(TOS)
1650 001C44 2453 ADD #2,PSP
1651 001C46 3744 MOV @PSP+,TOS
1652 001C48 NEXT
1652.1 001C48 3645 MOV @IP+,W // ; fetch word address
into W
1652.2 001C4A 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
1652.3 001C4C ENDM
1653 001C4C
1654 001C4C ;U CCLR mask addr -- reset bit from mask
in addr
1655 001C4C HEADER cclr,4,'cclr',DOCODE
1655.1 000000 PUBLIC cclr
1655.2 001C4C .... DW link
1655.3 001C4E FF DB 0FFh ; not immediate
1655.4 001C4F link SET $
1655.5 001C4F 04 DB 4
1655.6 001C50 63636C72 DB 'cclr'
1655.7 001C54 EVEN
1655.8 001C54 IF 'DOCODE'='DOCODE'
1655.9 001C54 .... cclr: DW $+2
1655.10 001C56 ELSE
1655.11 001C56 cclr: DW DOCODE
1655.12 001C56 ENDIF
1655.13 001C56 ENDM
1656 001C56 E7C40000 BIC.B @PSP,0(TOS)
1657 001C5A 2453 ADD #2,PSP
1658 001C5C 3744 MOV @PSP+,TOS
1659 001C5E NEXT
1659.1 001C5E 3645 MOV @IP+,W // ; fetch word address
into W
1659.2 001C60 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
1659.3 001C62 ENDM
1660 001C62
1661 001C62 ;U CTOGGLE mask addr -- flip bit from
mask in addr
1662 001C62 HEADER ctoggle,7,'ctoggle',DOCODE
1662.1 000000 PUBLIC ctoggle
1662.2 001C62 .... DW link
1662.3 001C64 FF DB 0FFh ; not immediate
1662.4 001C65 link SET $
1662.5 001C65 07 DB 7
1662.6 001C66 63746F67676C* DB 'ctoggle'
1662.7 001C6D 00 EVEN
1662.8 001C6E IF 'DOCODE'='DOCODE'
1662.9 001C6E .... ctoggle: DW $+2
1662.10 001C70 ELSE
1662.11 001C70 ctoggle: DW DOCODE
1662.12 001C70 ENDIF
1662.13 001C70 ENDM
1663 001C70 E7E40000 XOR.B @PSP,0(TOS)
1664 001C74 2453 ADD #2,PSP
1665 001C76 3744 MOV @PSP+,TOS
1666 001C78 NEXT
1666.1 001C78 3645 MOV @IP+,W // ; fetch word address
into W
1666.2 001C7A 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
1666.3 001C7C ENDM
1667 001C7C
1668 001C7C ;U CGET mask addr -- flag test bit from
mask in addr
1669 001C7C HEADER cget,4,'cget',DOCODE
1669.1 000000 PUBLIC cget
1669.2 001C7C .... DW link
1669.3 001C7E FF DB 0FFh ; not immediate
1669.4 001C7F link SET $
1669.5 001C7F 04 DB 4
1669.6 001C80 63676574 DB 'cget'
1669.7 001C84 EVEN
1669.8 001C84 IF 'DOCODE'='DOCODE'
1669.9 001C84 .... cget: DW $+2
1669.10 001C86 ELSE
1669.11 001C86 cget: DW DOCODE
1669.12 001C86 ENDIF
1669.13 001C86 ENDM
1670 001C86 E7B40000 BIT.B @PSP,0(TOS)
1671 001C8A 0224 JZ cget1
1672 001C8C 3743 MOV #-1,TOS
1673 001C8E 013C JMP cget2
1674 001C90 0743 cget1:MOV #0, TOS
1675 001C92 2453 cget2:ADD #2,PSP
1676 001C94 NEXT
1676.1 001C94 3645 MOV @IP+,W // ; fetch word address
into W
1676.2 001C96 3046 MOV @W+,PC // ; fetch code address
into PC, W=PFA
1676.3 001C98 ENDM
1677 001C98
1678 001C98 ;U Memory info ---------------------------------
--------------------------------
1679 001C98
1680 001C98 ;Z MEMBOT -- adr begining of flash
1681 001C98 HEADER MEMBOT,6,'membot',DOCON
1681.1 000000 PUBLIC MEMBOT
1681.2 001C98 .... DW link
1681.3 001C9A FF DB 0FFh ; not immediate
1681.4 001C9B link SET $
1681.5 001C9B 06 DB 6
1681.6 001C9C 6D656D626F74 DB 'membot'
1681.7 001CA2 EVEN
1681.8 001CA2 IF 'DOCON'='DOCODE'
1681.9 001CA2 MEMBOT: DW $+2
1681.10 001CA2 ELSE
1681.11 001CA2 .... MEMBOT: DW DOCON
1681.12 001CA4 ENDIF
1681.13 001CA4 ENDM
1682 001CA4 00C0 DW FLASHSTART
1683 001CA6
1684 001CA6 ;Z MEMTOP -- adr end of flash
1685 001CA6 HEADER MEMTOP,6,'memtop',DOCON
1685.1 000000 PUBLIC MEMTOP
1685.2 001CA6 .... DW link
1685.3 001CA8 FF DB 0FFh ; not immediate
1685.4 001CA9 link SET $
1685.5 001CA9 06 DB 6
1685.6 001CAA 6D656D746F70 DB 'memtop'
1685.7 001CB0 EVEN
1685.8 001CB0 IF 'DOCON'='DOCODE'
1685.9 001CB0 MEMTOP: DW $+2
1685.10 001CB0 ELSE
1685.11 001CB0 .... MEMTOP: DW DOCON
1685.12 001CB2 ENDIF
1685.13 001CB2 ENDM
1686 001CB2 FFDF DW FLASHEND
1687 001CB4
1688 001CB4 ;U MEM -- n bytes left in FRAM
1689 001CB4 HEADER MEM,3,'mem',DOCOLON
1689.1 000000 PUBLIC MEM
1689.2 001CB4 .... DW link
1689.3 001CB6 FF DB 0FFh ; not immediate
1689.4 001CB7 link SET $
1689.5 001CB7 03 DB 3
1689.6 001CB8 6D656D DB 'mem'
1689.7 001CBB 00 EVEN
1689.8 001CBC IF 'DOCOLON'='DOCODE'
1689.9 001CBC MEM: DW $+2
1689.10 001CBC ELSE
1689.11 001CBC .... MEM: DW DOCOLON
1689.12 001CBE ENDIF
1689.13 001CBE ENDM
1690 001CBE ............ DW MEMTOP,IHERE,MINUS
1691 001CC4 .... DW EXIT
1692 001CC6
1693 001CC6 ;U UNUSED -- u bytes left in RAM
1694 001CC6 HEADER UNUSED,6,'unused',DOCOLON
1694.1 000000 PUBLIC UNUSED
1694.2 001CC6 .... DW link
1694.3 001CC8 FF DB 0FFh ; not immediate
1694.4 001CC9 link SET $
1694.5 001CC9 06 DB 6
1694.6 001CCA 756E75736564 DB 'unused'
1694.7 001CD0 EVEN
1694.8 001CD0 IF 'DOCOLON'='DOCODE'
1694.9 001CD0 UNUSED: DW $+2
1694.10 001CD0 ELSE
1694.11 001CD0 .... UNUSED: DW DOCOLON
1694.12 001CD2 ENDIF
1694.13 001CD2 ENDM
1695 001CD2 ....FF03....* DW lit,RAMEND,HERE,MINUS
1696 001CDA .... DW EXIT
1697 001CDC
1698 001CDC ;U MCU Peripherie ------------------------------
--------------------------------
1699 001CDC
1700 001CDC ;Z P1 -- adr address of port1 output
register
1701 001CDC HEADER P1,2,'p1',DOCON
1701.1 000000 PUBLIC P1
1701.2 001CDC .... DW link
1701.3 001CDE FF DB 0FFh ; not immediate
1701.4 001CDF link SET $
1701.5 001CDF 02 DB 2
1701.6 001CE0 7031 DB 'p1'
1701.7 001CE2 EVEN
1701.8 001CE2 IF 'DOCON'='DOCODE'
1701.9 001CE2 P1: DW $+2
1701.10 001CE2 ELSE
1701.11 001CE2 .... P1: DW DOCON
1701.12 001CE4 ENDIF
1701.13 001CE4 ENDM
1702 001CE4 2100 DW P1OUT
1703 001CE6
1704 001CE6 ;Z P2 -- adr address of port2 output
register
1705 001CE6 HEADER P2,2,'p2',DOCON
1705.1 000000 PUBLIC P2
1705.2 001CE6 .... DW link
1705.3 001CE8 FF DB 0FFh ; not immediate
1705.4 001CE9 link SET $
1705.5 001CE9 02 DB 2
1705.6 001CEA 7032 DB 'p2'
1705.7 001CEC EVEN
1705.8 001CEC IF 'DOCON'='DOCODE'
1705.9 001CEC P2: DW $+2
1705.10 001CEC ELSE
1705.11 001CEC .... P2: DW DOCON
1705.12 001CEE ENDIF
1705.13 001CEE ENDM
1706 001CEE 2900 DW P2OUT
1707 001CF0
1708 001CF0 ;Z P3 -- adr address of port2 output
register
1709 001CF0 HEADER P3,2,'p3',DOCON
1709.1 000000 PUBLIC P3
1709.2 001CF0 .... DW link
1709.3 001CF2 FF DB 0FFh ; not immediate
1709.4 001CF3 link SET $
1709.5 001CF3 02 DB 2
1709.6 001CF4 7033 DB 'p3'
1709.7 001CF6 EVEN
1709.8 001CF6 IF 'DOCON'='DOCODE'
1709.9 001CF6 P3: DW $+2
1709.10 001CF6 ELSE
1709.11 001CF6 .... P3: DW DOCON
1709.12 001CF8 ENDIF
1709.13 001CF8 ENDM
1710 001CF8 1900 DW P3OUT
1711 001CFA
1712 001CFA ; Note: the first character sent from the MSP430
seems to get
1713 001CFA ; scrambled. I conjecture this is because the
baud rate generator
1714 001CFA ; has not reset to the new rate when we attempt
to send a character.
1715 001CFA ; See init430f1611.s43 for delay after
initialization.
1716 001CFA
1717 001CFA
922 001CFA #include "se-LaunchPad.s43"
1 001CFA ;U MSP-EXP430G2 LaunchPad ======================
===========================
2 001CFA
3 001CFA ;U PORTS ---------------------------------------
---------------------------
4 001CFA
5 001CFA ; TI document SLAU144I - December 2004 - Revised
January 2012
6 001CFA ; The digital I/O registers are listed in Table
8-2.
7 001CFA
8 001CFA ;U \ P1in = $20
9 001CFA ;U \ P1out = $21
10 001CFA ;U \ P1dir = $22
11 001CFA
12 001CFA ;U \ P2in = $28
13 001CFA ;U \ P2out = $29
14 001CFA ;U \ P2dir = $2A
15 001CFA
16 001CFA ;U \ LED - portpinX->---resistor---LED---GND
17 001CFA ;U \ P1.0 - red LED
18 001CFA ;U \ P1.6 - green LED
19 001CFA
20 001CFA ;U RED -- mask port red LED mask
and port address
21 001CFA HEADER red,3,'red',DOTWOCON
21.1 000000 PUBLIC red
21.2 001CFA .... DW link
21.3 001CFC FF DB 0FFh ; not immediate
21.4 001CFD link SET $
21.5 001CFD 03 DB 3
21.6 001CFE 726564 DB 'red'
21.7 001D01 00 EVEN
21.8 001D02 IF 'DOTWOCON'='DOCODE'
21.9 001D02 red: DW $+2
21.10 001D02 ELSE
21.11 001D02 .... red: DW DOTWOCON
21.12 001D04 ENDIF
21.13 001D04 ENDM
22 001D04 2100 DW P1OUT
23 001D06 0100 DW 00000001b
24 001D08
25 001D08 ;U GREEN -- mask port green LED mask
and port address
26 001D08 HEADER green,5,'green',DOTWOCON
26.1 000000 PUBLIC green
26.2 001D08 .... DW link
26.3 001D0A FF DB 0FFh ; not immediate
26.4 001D0B link SET $
26.5 001D0B 05 DB 5
26.6 001D0C 677265656E DB 'green'
26.7 001D11 00 EVEN
26.8 001D12 IF 'DOTWOCON'='DOCODE'
26.9 001D12 green: DW $+2
26.10 001D12 ELSE
26.11 001D12 .... green: DW DOTWOCON
26.12 001D14 ENDIF
26.13 001D14 ENDM
27 001D14 2100 DW P1OUT
28 001D16 4000 DW 01000000b
29 001D18
30 001D18 ;U \ Switch S2
31 001D18 ;U portpin P1.3 --->0_0----GND
32 001D18 ;U S2 -- mask port second button
mask and port address
33 001D18 HEADER S2,2,'s2',DOTWOCON
33.1 000000 PUBLIC S2
33.2 001D18 .... DW link
33.3 001D1A FF DB 0FFh ; not immediate
33.4 001D1B link SET $
33.5 001D1B 02 DB 2
33.6 001D1C 7332 DB 's2'
33.7 001D1E EVEN
33.8 001D1E IF 'DOTWOCON'='DOCODE'
33.9 001D1E S2: DW $+2
33.10 001D1E ELSE
33.11 001D1E .... S2: DW DOTWOCON
33.12 001D20 ENDIF
33.13 001D20 ENDM
34 001D20 2000 DW P1IN
35 001D22 0800 DW 00001000b
36 001D24
37 001D24 ;U S? -- f test button S2, true is
pressed
38 001D24 HEADER SQEST,2,'s?',DOCOLON
38.1 000000 PUBLIC SQEST
38.2 001D24 .... DW link
38.3 001D26 FF DB 0FFh ; not immediate
38.4 001D27 link SET $
38.5 001D27 02 DB 2
38.6 001D28 733F DB 's?'
38.7 001D2A EVEN
38.8 001D2A IF 'DOCOLON'='DOCODE'
38.9 001D2A SQEST: DW $+2
38.10 001D2A ELSE
38.11 001D2A .... SQEST: DW DOCOLON
38.12 001D2C ENDIF
38.13 001D2C ENDM
39 001D2C ............* DW S2, cget, ZEROEQUAL, EXIT
40 001D34
41 001D34 ; amforth Kompatibilität -----------------------
--------------------------------
42 001D34
43 001D34 ;U portpin: comp: portadr n -- | name
pin n von Portx eien namen geben.
44 001D34 ;U exec: -- mask adr
liefert mask und adr
45 001D34 ; 1 swap lshift swap 2constant ;
46 001D34 HEADER PORTPINDEF,8,'portpin:',DOCOLON
46.1 000000 PUBLIC PORTPINDEF
46.2 001D34 .... DW link
46.3 001D36 FF DB 0FFh ; not immediate
46.4 001D37 link SET $
46.5 001D37 08 DB 8
46.6 001D38 706F72747069* DB 'portpin:'
46.7 001D40 EVEN
46.8 001D40 IF 'DOCOLON'='DOCODE'
46.9 001D40 PORTPINDEF: DW $+2
46.10 001D40 ELSE
46.11 001D40 .... PORTPINDEF: DW DOCOLON
46.12 001D42 ENDIF
46.13 001D42 ENDM
47 001D42 ....0100....* DW lit,1,SWAP,LSHIFT,SWAP,TWOCONSTANT,EXI
T
48 001D50
49 001D50 ;U low mask adr -- alias
von cclr
50 001D50 HEADER LOWW,3,'low',DOCOLON
50.1 000000 PUBLIC LOWW
50.2 001D50 .... DW link
50.3 001D52 FF DB 0FFh ; not immediate
50.4 001D53 link SET $
50.5 001D53 03 DB 3
50.6 001D54 6C6F77 DB 'low'
50.7 001D57 00 EVEN
50.8 001D58 IF 'DOCOLON'='DOCODE'
50.9 001D58 LOWW: DW $+2
50.10 001D58 ELSE
50.11 001D58 .... LOWW: DW DOCOLON
50.12 001D5A ENDIF
50.13 001D5A ENDM
51 001D5A ........ DW cclr,EXIT
52 001D5E
53 001D5E ;U high mask adr -- alias
von cset
54 001D5E HEADER HIGHH,4,'high',DOCOLON
54.1 000000 PUBLIC HIGHH
54.2 001D5E .... DW link
54.3 001D60 FF DB 0FFh ; not immediate
54.4 001D61 link SET $
54.5 001D61 04 DB 4
54.6 001D62 68696768 DB 'high'
54.7 001D66 EVEN
54.8 001D66 IF 'DOCOLON'='DOCODE'
54.9 001D66 HIGHH: DW $+2
54.10 001D66 ELSE
54.11 001D66 .... HIGHH: DW DOCOLON
54.12 001D68 ENDIF
54.13 001D68 ENDM
55 001D68 ........ DW cset,EXIT
56 001D6C
57 001D6C ; benutze es so:
58 001D6C ; p1 0 portpin: redled
59 001D6C ; p1 6 portpin: greenled
60 001D6C ;
61 001D6C ; redled high
62 001D6C ; geenled low
63 001D6C ;
923 001D6C
924 001D6C
925 001D6C /*
926 001D6C ; DEBUG FORTH EXECUTION
927 001D6C ; debug serieal
928 001D6C PUBLIC DEBUGIP
929 001D6C DEBUGIP:
930 001D6C ; DW DOTID
931 001D6C DEBUG1:
932 001D6C ; DW TASK
933 001D6C DW KEY ; 1@A0 test 1=rot,@=grün,A=beide,0=a
us
934 001D6C DW DUP ;,DOTS,CR
935 001D6C DW STORELEDS
936 001D6C ; DW COLD
937 001D6C DW EMIT
938 001D6C DW lit,0,qbran
939 001D6C DW DEBUG1-$
940 001D6C DW bran,-2
941 001D6C
942 001D6C /*
943 001D6C ; debugging only
944 001D6C HEADLESS CREATE,DOCOLON
945 001D6C HEADLESS ALLOT,DOCOLON
946 001D6C HEADLESS BUILDS,DOCOLON
947 001D6C HEADLESS ICOMMA,DOCOLON
948 001D6C HEADLESS XDOES,DOCOLON
949 001D6C HEADLESS IHERE,DOCOLON
950 001D6C HEADLESS IALLOT,DOCOLON
951 001D6C HEADLESS CELL,DOCOLON
952 001D6C HEADLESS PJOUT,DOCOLON
953 001D6C */
954 001D6C
955 001D6C
956 000000 PUBLIC lastword
957 001D6C lastword equ link
958 001D6C
959 001D6C ; for debug map only:
960 001D6C CF430FRend:
961 001D6C #define CFlength = CF430FRend-CF430FRstart
962 001D6C
963 001D6C END
Segment Type Mode
----------------------------------------
CODE UNTYPED REL
Label Mode Type Segment Value/Offset
------------------------------------------------------------------------------
ABBS REL CONST PUB UNTYP. CODE AC0
ABORT REL CONST PUB UNTYP. CODE 1438
ABORTQUOTE REL CONST PUB UNTYP. CODE 1464
ACC1 REL CONST UNTYP. CODE D3E
ACC3 REL CONST UNTYP. CODE D74
ACC4 REL CONST UNTYP. CODE D7E
ACC5 REL CONST UNTYP. CODE D82
ACCEPT REL CONST PUB UNTYP. CODE D34
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 16CA
ALIGNED REL CONST PUB UNTYP. CODE 800
ALIGNN REL CONST PUB UNTYP. CODE 7E6
ALLOT REL CONST PUB UNTYP. CODE 1022
ANDD REL CONST PUB UNTYP. CODE 402
APP REL CONST PUB UNTYP. CODE 9BE
APPCRC REL CONST PUB UNTYP. CODE 1A5E
APPU0 REL CONST PUB UNTYP. CODE A8C
AppU0 ABS CONST EXT [012] UNTYP. __EXTERNS Solved Extern
BACKSLASH REL CONST PUB UNTYP. CODE 1B94
BASE REL CONST PUB UNTYP. CODE 94E
BCSCTL1 ABS CONST UNTYP. ASEG 57
BCSCTL2 ABS CONST UNTYP. ASEG 58
BCSCTL3 ABS CONST UNTYP. ASEG 53
BEGIN REL CONST PUB UNTYP. CODE 16A4
BELL REL CONST PUB UNTYP. CODE 1BCC
BIN REL CONST PUB UNTYP. CODE 1BDE
BLANK REL CONST PUB UNTYP. CODE A2A
BOOT REL CONST PUB UNTYP. CODE 1ABA
BOOTIP REL CONST PUB UNTYP. CODE 1ABC
BRACCHAR REL CONST PUB UNTYP. CODE 14A8
BRACTICK REL CONST PUB UNTYP. CODE 1612
BUILDS REL CONST PUB UNTYP. CODE 1500
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 11F2
CAPS REL CONST PUB UNTYP. CODE 9CA
CAPS1 REL CONST UNTYP. CODE 1208
CAPS2 REL CONST UNTYP. CODE 1216
CCOMMA REL CONST PUB UNTYP. CODE 1046
CCRC REL CONST PUB UNTYP. CODE 19B4
CELL REL CONST PUB UNTYP. CODE 816
CELLPLUS REL CONST PUB UNTYP. CODE 824
CELLS REL CONST PUB UNTYP. CODE 834
CEXIT REL CONST PUB UNTYP. CODE 8DA
CF430FRend REL CONST UNTYP. CODE 1D6C
CFETCH REL CONST PUB UNTYP. CODE 228
CHARPLUS REL CONST PUB UNTYP. CODE 840
CHARR REL CONST PUB UNTYP. CODE 1492
CHARS REL CONST PUB UNTYP. CODE 84C
CMOVE REL CONST PUB UNTYP. CODE 6C2
CMOVEUP REL CONST PUB UNTYP. CODE 6E6
CMOVE_1 REL CONST UNTYP. CODE 6CC
CMOVE_X REL CONST UNTYP. CODE 6D6
CMOVU_1 REL CONST UNTYP. CODE 6F4
CMOVU_X REL CONST UNTYP. CODE 700
COLD REL CONST PUB UNTYP. CODE 1B1A
COLON REL CONST PUB UNTYP. CODE 15EE
COMMA REL CONST PUB UNTYP. CODE 1030
COMMABRANCH REL CONST PUB UNTYP. CODE 8F0
COMMACALL REL CONST PUB UNTYP. CODE 896
COMMACF REL CONST PUB UNTYP. CODE 87E
COMMADEST REL CONST PUB UNTYP. CODE 8FE
COMMAJMP REL CONST PUB UNTYP. CODE 8AA
COMMANONE REL CONST PUB UNTYP. CODE 928
COMMAXT REL CONST PUB UNTYP. CODE 866
CONSTANT REL CONST PUB UNTYP. CODE 82
COR REL CONST PUB UNTYP. CODE A70
CORPOWERON ABS CONST UNTYP. CODE 186
CORREST ABS CONST UNTYP. CODE 18E
COUNT REL CONST PUB UNTYP. CODE CA8
CR REL CONST PUB UNTYP. CODE CBA
CRC REL CONST PUB UNTYP. CODE 1A1C
CREATE REL CONST PUB UNTYP. CODE 1516
CSTORE REL CONST PUB UNTYP. CODE 236
DABS REL CONST PUB UNTYP. CODE B06
DCOCTL ABS CONST UNTYP. ASEG 56
DDP REL CONST PUB UNTYP. CODE 966
DECIMAL REL CONST PUB UNTYP. CODE FE8
DEPTH REL CONST PUB UNTYP. CODE 17F6
DIGITQ REL CONST PUB UNTYP. CODE 1242
DIV1 REL CONST UNTYP. CODE 670
DIV2 REL CONST UNTYP. CODE 676
DIV3 REL CONST UNTYP. CODE 68A
DIV4 REL CONST UNTYP. CODE 68C
DIVIDE REL CONST UNTYP. CODE 66A
DNEG1 REL CONST UNTYP. CODE AFC
DNEGATE REL CONST PUB UNTYP. CODE AD4
DO REL CONST PUB UNTYP. CODE 172E
DOALIAS REL CONST PUB UNTYP. CODE C2
DOCODE REL CONST UNTYP. CODE Not solved
DOCOLON REL CONST PUB UNTYP. CODE 58
DOCON REL CONST PUB UNTYP. CODE 8A
DOES REL CONST PUB UNTYP. CODE 154A
DOROM REL CONST PUB UNTYP. CODE 96
DOT REL CONST PUB UNTYP. CODE FC2
DOT1 REL CONST UNTYP. CODE 13E6
DOTCOLD REL CONST PUB UNTYP. CODE 1B04
DOTQUOTE REL CONST PUB UNTYP. CODE E8A
DOTS REL CONST PUB UNTYP. CODE 196C
DOTS1 REL CONST UNTYP. CODE 199C
DOTS2 REL CONST UNTYP. CODE 19AA
DOTSTATUS REL CONST PUB UNTYP. CODE 13CA
DOTVER REL CONST PUB UNTYP. CODE 1BA8
DOTWOCON REL CONST PUB UNTYP. CODE 1B7E
DOUSER REL CONST PUB UNTYP. CODE B2
DOVAR REL CONST PUB UNTYP. CODE 8A
DROP REL CONST PUB UNTYP. CODE 108
DTOI REL CONST PUB UNTYP. CODE 362
DTOI_BYTE REL CONST UNTYP. CODE 394
DTOI_END REL CONST UNTYP. CODE 39A
DTOI_LOOP REL CONST UNTYP. CODE 36C
DTOI_WORD REL CONST UNTYP. CODE 382
DTOI_X REL CONST UNTYP. CODE 3AC
DUMP REL CONST PUB UNTYP. CODE 1900
DUP REL CONST PUB UNTYP. CODE E2
ELSS REL CONST PUB UNTYP. CODE 1688
EMIT REL CONST PUB UNTYP. CODE 794
EMITLOOP REL CONST UNTYP. CODE 796
EMITVEC REL CONST PUB UNTYP. CODE 9DA
ENDLOOP REL CONST PUB UNTYP. CODE 174C
ENVIRONMENTQ REL CONST PUB UNTYP. CODE 1814
EQUAL REL CONST PUB UNTYP. CODE 4FE
EVALUATE REL CONST PUB UNTYP. CODE 13A8
EXECUTE REL CONST PUB UNTYP. CODE 2A
EXIT REL CONST PUB UNTYP. CODE 50
FACTORY REL CONST PUB UNTYP. CODE 1B38
FACTORYIP REL CONST PUB UNTYP. CODE 1B3A
FCTL1 ABS CONST UNTYP. ASEG 128
FCTL2 ABS CONST UNTYP. ASEG 12A
FCTL3 ABS CONST UNTYP. ASEG 12C
FETCH REL CONST PUB UNTYP. CODE 208
FILL REL CONST PUB UNTYP. CODE 69E
FILL_1 REL CONST UNTYP. CODE 6A8
FILL_X REL CONST UNTYP. CODE 6B2
FIND REL CONST PUB UNTYP. CODE 1192
FIND1 REL CONST UNTYP. CODE 1198
FIND2 REL CONST UNTYP. CODE 11B0
FIND3 REL CONST UNTYP. CODE 11CE
FLALIGNED REL CONST PUB UNTYP. CODE 1838
FLERASE REL CONST PUB UNTYP. CODE 250
FLE_1 REL CONST UNTYP. CODE 256
FLE_INFO REL CONST UNTYP. CODE 266
FLE_OK REL CONST UNTYP. CODE 272
FLE_X REL CONST UNTYP. CODE 2A8
FL_INFO REL CONST UNTYP. CODE 2A2
FMMOD1 REL CONST UNTYP. CODE B8A
FMSLASHMOD REL CONST PUB UNTYP. CODE B64
F_CPU REL CONST PUB UNTYP. CODE 1C32
GREATER REL CONST PUB UNTYP. CODE 534
HEADR REL CONST PUB UNTYP. CODE 14D2
HERE REL CONST PUB UNTYP. CODE 1010
HEX REL CONST PUB UNTYP. CODE FFC
HIDE REL CONST PUB UNTYP. CODE 159E
HIGHH REL CONST PUB UNTYP. CODE 1D66
HOLD REL CONST PUB UNTYP. CODE F04
HP REL CONST PUB UNTYP. CODE 98E
IALLOT REL CONST PUB UNTYP. CODE 1072
ICCOMMA REL CONST PUB UNTYP. CODE 1098
ICFETCH REL CONST PUB UNTYP. CODE 358
ICOMMA REL CONST PUB UNTYP. CODE 1080
ICOUNT REL CONST PUB UNTYP. CODE DC0
ICSTORE REL CONST PUB UNTYP. CODE 306
ICST_INFO REL CONST UNTYP. CODE 31A
ICST_OK REL CONST UNTYP. CODE 326
ICST_RAM REL CONST UNTYP. CODE 334
IDP REL CONST PUB UNTYP. CODE 9A4
IE1 ABS CONST UNTYP. ASEG 0
IE2 ABS CONST UNTYP. ASEG 1
IFETCH REL CONST PUB UNTYP. CODE 34E
IFF REL CONST PUB UNTYP. CODE 1660
IFG1 ABS CONST UNTYP. ASEG 2
IFG2 ABS CONST UNTYP. ASEG 3
IHERE REL CONST PUB UNTYP. CODE 1060
II REL CONST PUB UNTYP. CODE 5F0
IMMEDIATE REL CONST PUB UNTYP. CODE 15D8
IMMEDQ REL CONST PUB UNTYP. CODE 117A
INFOB REL CONST PUB UNTYP. CODE A7E
INTER1 REL CONST UNTYP. CODE 134A
INTER2 REL CONST UNTYP. CODE 1374
INTER3 REL CONST UNTYP. CODE 1376
INTER4 REL CONST UNTYP. CODE 137A
INTER5 REL CONST UNTYP. CODE 1386
INTER6 REL CONST UNTYP. CODE 1394
INTER8 REL CONST UNTYP. CODE 1394
INTER9 REL CONST UNTYP. CODE 1398
INTERPRET REL CONST PUB UNTYP. CODE 133C
INVERT REL CONST PUB UNTYP. CODE 432
ISQUOTE REL CONST PUB UNTYP. CODE E46
ISTORE REL CONST PUB UNTYP. CODE 2B4
IST_INFO REL CONST UNTYP. CODE 2CC
IST_OK REL CONST UNTYP. CODE 2D8
IST_RAM REL CONST UNTYP. CODE 2E6
IST_X REL CONST UNTYP. CODE 2F8
ITHERE REL CONST PUB UNTYP. CODE 1A34
ITOD REL CONST PUB UNTYP. CODE 70E
ITYP3 REL CONST UNTYP. CODE DE6
ITYP4 REL CONST UNTYP. CODE DF4
ITYP5 REL CONST UNTYP. CODE DF6
ITYPE REL CONST PUB UNTYP. CODE DD6
IWORD REL CONST PUB UNTYP. CODE EA0
IWORD1 REL CONST UNTYP. CODE EA4
IWORDC REL CONST PUB UNTYP. CODE EB2
JJ REL CONST PUB UNTYP. CODE 606
KEY REL CONST PUB UNTYP. CODE 7AE
KEYLOOP REL CONST UNTYP. CODE 7B0
KEYQ REL CONST PUB UNTYP. CODE 7CC
L$002 REL CONST UNTYP. CODE 640
L$01 REL CONST UNTYP. CODE 648
L0 REL CONST PUB UNTYP. CODE 9F0
LATEST REL CONST PUB UNTYP. CODE 984
LDUMP1 REL CONST UNTYP. CODE 190A
LDUMP2 REL CONST UNTYP. CODE 1924
LDUMP3 REL CONST UNTYP. CODE 1942
LEAV REL CONST PUB UNTYP. CODE 1792
LEFTBRACKET REL CONST PUB UNTYP. CODE 1578
LESS REL CONST PUB UNTYP. CODE 520
LESSNUM REL CONST PUB UNTYP. CODE F1C
LFROM REL CONST PUB UNTYP. CODE 1716
LITER1 REL CONST UNTYP. CODE 1236
LITERAL REL CONST PUB UNTYP. CODE 1224
LOO REL CONST PUB UNTYP. CODE 176A
LOOP1 REL CONST UNTYP. CODE 1752
LOOP2 REL CONST UNTYP. CODE 1760
LOWW REL CONST PUB UNTYP. CODE 1D58
LP REL CONST PUB UNTYP. CODE 998
LSHIFT REL CONST PUB UNTYP. CODE 49E
LSH_1 REL CONST UNTYP. CODE 4A8
LSH_X REL CONST UNTYP. CODE 4AE
LSTACK ABS CONST EXT [003] UNTYP. __EXTERNS Solved Extern
MACU REL CONST UNTYP. CODE 63C
MARKER REL CONST PUB UNTYP. CODE 1856
MAX REL CONST PUB UNTYP. CODE BFC
MAX1 REL CONST UNTYP. CODE C08
MEM REL CONST PUB UNTYP. CODE 1CBC
MEMBOT REL CONST PUB UNTYP. CODE 1CA2
MEMTOP REL CONST PUB UNTYP. CODE 1CB0
MIN REL CONST PUB UNTYP. CODE C14
MIN1 REL CONST UNTYP. CODE C20
MINUS REL CONST PUB UNTYP. CODE 3EE
MODD REL CONST PUB UNTYP. CODE BC8
MOVE REL CONST PUB UNTYP. CODE 17CA
MOVE1 REL CONST UNTYP. CODE 17E6
MOVE2 REL CONST UNTYP. CODE 17EA
MPLUS REL CONST PUB UNTYP. CODE 3D8
MPYU REL CONST UNTYP. CODE 638
MS REL CONST PUB UNTYP. CODE 1C18
MSTAR REL CONST PUB UNTYP. CODE B14
NEGATE REL CONST PUB UNTYP. CODE 444
NEQUAL REL CONST PUB UNTYP. CODE 78A
NEWEST REL CONST PUB UNTYP. CODE 9B2
NFATOCFA REL CONST PUB UNTYP. CODE 1160
NFATOLFA REL CONST PUB UNTYP. CODE 114A
NINIT REL CONST PUB UNTYP. CODE A64
NIP REL CONST PUB UNTYP. CODE 162
NODUP REL CONST UNTYP. CODE FC
NOOP REL CONST PUB UNTYP. CODE 1826
NOTEQUAL REL CONST PUB UNTYP. CODE 512
NUM REL CONST PUB UNTYP. CODE F50
NUMGREATER REL CONST PUB UNTYP. CODE F7C
NUMS REL CONST PUB UNTYP. CODE F66
NUMS1 REL CONST UNTYP. CODE F68
ONEMINUS REL CONST PUB UNTYP. CODE 462
ONEMS REL CONST PUB UNTYP. CODE 1BF2
ONEPLUS REL CONST PUB UNTYP. CODE 454
ORR REL CONST PUB UNTYP. CODE 410
OVER REL CONST PUB UNTYP. CODE 12E
P1 REL CONST PUB UNTYP. CODE 1CE2
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 1CEC
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 1CF6
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 9E6
PADAREA ABS CONST EXT [002] UNTYP. __EXTERNS Solved Extern
PAREN REL CONST PUB UNTYP. CODE 14BC
PCRC REL CONST PUB UNTYP. CODE 19F2
PLUS REL CONST PUB UNTYP. CODE 3B8
PLUSLOOP REL CONST PUB UNTYP. CODE 177E
PLUSSTORE REL CONST PUB UNTYP. CODE 3C6
PORTPINDEF REL CONST PUB UNTYP. CODE 1D40
POST1 REL CONST UNTYP. CODE 1656
POST2 REL CONST UNTYP. CODE 1658
POSTPONE REL CONST PUB UNTYP. CODE 162C
PROMPT REL CONST PUB UNTYP. CODE 13E8
PROMPT1 REL CONST UNTYP. CODE 13F2
PSTACK ABS CONST EXT [004] UNTYP. __EXTERNS Solved Extern
PUSHTOS REL CONST UNTYP. CODE E4
QABO1 REL CONST UNTYP. CODE 1456
QABORT REL CONST PUB UNTYP. CODE 144A
QDNEGATE REL CONST PUB UNTYP. CODE AF2
QDUP REL CONST PUB UNTYP. CODE F6
QNEG1 REL CONST UNTYP. CODE AB6
QNEGATE REL CONST PUB UNTYP. CODE AAC
QNUM1 REL CONST UNTYP. CODE 131C
QNUM2 REL CONST UNTYP. CODE 1328
QNUM3 REL CONST UNTYP. CODE 132C
QNUMBER REL CONST PUB UNTYP. CODE 12F6
QSIGN REL CONST PUB UNTYP. CODE 127E
QSIGN1 REL CONST UNTYP. CODE 12A8
QUIT REL CONST PUB UNTYP. CODE 13FC
QUIT1 REL CONST UNTYP. CODE 1410
QUIT2 REL CONST UNTYP. CODE 141C
QUITIP REL CONST PUB UNTYP. CODE 13FE
RAMDICT ABS CONST EXT [007] UNTYP. __EXTERNS Solved Extern
RECURSE REL CONST PUB UNTYP. CODE 1566
REPEAT REL CONST PUB UNTYP. CODE 16F2
REVEAL REL CONST PUB UNTYP. CODE 15BE
RFETCH REL CONST PUB UNTYP. CODE 194
RFROM REL CONST PUB UNTYP. CODE 180
RIGHTBRACKET REL CONST PUB UNTYP. CODE 158A
ROMDICT ABS CONST EXT [-001] UNTYP. __EXTERNS Solved Extern
ROT REL CONST PUB UNTYP. CODE 146
RPFETCH REL CONST PUB UNTYP. CODE 1D2
RPSTORE REL CONST PUB UNTYP. CODE 1E8
RSHIFT REL CONST PUB UNTYP. CODE 4BE
RSH_1 REL CONST UNTYP. CODE 4C8
RSH_X REL CONST UNTYP. CODE 4D0
RSTACK ABS CONST EXT [005] UNTYP. __EXTERNS Solved Extern
RZERO REL CONST PUB UNTYP. CODE 9FA
S0 REL CONST PUB UNTYP. CODE A04
S2 REL CONST PUB UNTYP. CODE 1D1E
SAVE REL CONST PUB UNTYP. CODE 1A96
SCAN REL CONST PUB UNTYP. CODE 73E
SCAN_1 REL CONST UNTYP. CODE 748
SCAN_X REL CONST UNTYP. CODE 752
SEMICOLON REL CONST PUB UNTYP. CODE 1600
SEQUAL REL CONST PUB UNTYP. CODE 762
SEQU_1 REL CONST UNTYP. CODE 76C
SEQU_X REL CONST UNTYP. CODE 780
SIGN REL CONST PUB UNTYP. CODE F94
SIGN1 REL CONST UNTYP. CODE FA2
SKIP REL CONST PUB UNTYP. CODE 718
SKIP_1 REL CONST UNTYP. CODE 722
SKIP_X REL CONST UNTYP. CODE 72C
SLASH REL CONST PUB UNTYP. CODE BB8
SLASHMOD REL CONST PUB UNTYP. CODE BA6
SLASHSTRING REL CONST PUB UNTYP. CODE 10C6
SMISMATCH REL CONST UNTYP. CODE 77A
SMSLASHREM REL CONST PUB UNTYP. CODE B36
SOURCE REL CONST PUB UNTYP. CODE 10B2
SPACE REL CONST PUB UNTYP. CODE CD4
SPACES REL CONST PUB UNTYP. CODE CE6
SPCS1 REL CONST UNTYP. CODE CE8
SPCS2 REL CONST UNTYP. CODE CF6
SPFETCH REL CONST PUB UNTYP. CODE 1AA
SPSTORE REL CONST PUB UNTYP. CODE 1C0
SQEST REL CONST PUB UNTYP. CODE 1D2A
SQUOTE REL CONST PUB UNTYP. CODE E64
SSMOD REL CONST PUB UNTYP. CODE BDA
STAR REL CONST PUB UNTYP. CODE B96
STARSLASH REL CONST PUB UNTYP. CODE BEC
STATE REL CONST PUB UNTYP. CODE 95C
STOD REL CONST PUB UNTYP. CODE A98
STORCOLON REL CONST PUB UNTYP. CODE 8C0
STORE REL CONST PUB UNTYP. CODE 216
STORECF REL CONST PUB UNTYP. CODE 872
STOREDEST REL CONST PUB UNTYP. CODE 912
SWAP REL CONST PUB UNTYP. CODE 118
SWAPBYTES REL CONST PUB UNTYP. CODE 470
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 1676
TIB REL CONST PUB UNTYP. CODE A10
TIBAREA ABS CONST EXT [006] UNTYP. __EXTERNS Solved Extern
TIBSIZE REL CONST PUB UNTYP. CODE A20
TIB_SIZE ABS CONST EXT [008] UNTYP. __EXTERNS Solved Extern
TICK REL CONST PUB UNTYP. CODE 1476
TICKSOURCE REL CONST PUB UNTYP. CODE 976
TOBODY REL CONST PUB UNTYP. CODE 858
TOCOUNTED REL CONST PUB UNTYP. CODE 10E2
TODIGIT REL CONST PUB UNTYP. CODE F30
TOIN REL CONST PUB UNTYP. CODE 942
TOL REL CONST PUB UNTYP. CODE 1700
TONUM1 REL CONST UNTYP. CODE 12B8
TONUM2 REL CONST UNTYP. CODE 12CE
TONUM3 REL CONST UNTYP. CODE 12E8
TONUMBER REL CONST PUB UNTYP. CODE 12B6
TOR REL CONST PUB UNTYP. CODE 170
TOSFALSE REL CONST UNTYP. CODE 506
TOSTRUE REL CONST UNTYP. CODE 528
TUCK REL CONST PUB UNTYP. CODE 1FA
TWOCONSTANT REL CONST PUB UNTYP. CODE 1B74
TWODROP REL CONST PUB UNTYP. CODE C56
TWODUP REL CONST PUB UNTYP. CODE C66
TWOFETCH REL CONST PUB UNTYP. CODE C2A
TWOOVER REL CONST PUB UNTYP. CODE C8E
TWOSLASH REL CONST PUB UNTYP. CODE 48C
TWOSTAR REL CONST PUB UNTYP. CODE 47E
TWOSTORE REL CONST PUB UNTYP. CODE C3E
TWOSWAP REL CONST PUB UNTYP. CODE C78
TYP REL CONST PUB UNTYP. CODE D94
TYP3 REL CONST UNTYP. CODE DA4
TYP4 REL CONST UNTYP. CODE DB2
TYP5 REL CONST UNTYP. CODE DB4
U0 REL CONST PUB UNTYP. CODE 936
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 FAA
UDOTR REL CONST PUB UNTYP. CODE 18D8
UDSLASHMOD REL CONST PUB UNTYP. CODE EC6
UDSTAR REL CONST PUB UNTYP. CODE EE6
UGREATER REL CONST PUB UNTYP. CODE 552
UINIT REL CONST PUB UNTYP. CODE A38
ULESS REL CONST PUB UNTYP. CODE 542
UMAX REL CONST PUB UNTYP. CODE D1A
UMAX1 REL CONST UNTYP. CODE D26
UMIN REL CONST PUB UNTYP. CODE D02
UMIN1 REL CONST UNTYP. CODE D0E
UMSLASHMOD REL CONST PUB UNTYP. CODE 664
UMSTAR REL CONST PUB UNTYP. CODE 634
UNLOOP REL CONST PUB UNTYP. CODE 622
UNTIL REL CONST PUB UNTYP. CODE 16B4
UNUSED REL CONST PUB UNTYP. CODE 1CD0
UP ABS CONST EXT [000] UNTYP. __EXTERNS Solved Extern
UPC REL CONST PUB UNTYP. CODE 11D0
UPC1 REL CONST UNTYP. CODE 11EA
USER REL CONST PUB UNTYP. CODE AA
VALIDQ REL CONST PUB UNTYP. CODE 1A80
VARIABLE REL CONST PUB UNTYP. CODE 6C
WARM REL CONST PUB UNTYP. CODE 1AF6
WDS1 REL CONST UNTYP. CODE 18B2
WDTCTL ABS CONST UNTYP. ASEG 120
WHILE REL CONST PUB UNTYP. CODE 16E0
WIPE REL CONST PUB UNTYP. CODE 1B4E
WITHIN REL CONST PUB UNTYP. CODE 17B2
WORD1 REL CONST UNTYP. CODE 111C
WORDD REL CONST PUB UNTYP. CODE 10F8
WORDS REL CONST PUB UNTYP. CODE 18AC
XDOES REL CONST PUB UNTYP. CODE 1532
XISQUOTE REL CONST PUB UNTYP. CODE E02
XORR REL CONST PUB UNTYP. CODE 420
XSQUOTE REL CONST PUB UNTYP. CODE E1A
ZEROEQUAL REL CONST PUB UNTYP. CODE 4DC
ZEROLESS REL CONST PUB UNTYP. CODE 4EC
__MSP430G2203__ ABS CONST UNTYP. ASEG Not solved
boot1 REL CONST UNTYP. CODE 1AEC
bran REL CONST PUB UNTYP. CODE 564
cclr REL CONST PUB UNTYP. CODE 1C54
ccrc1 REL CONST UNTYP. CODE 19C8
cget REL CONST PUB UNTYP. CODE 1C84
cget1 REL CONST UNTYP. CODE 1C90
cget2 REL CONST UNTYP. CODE 1C92
cor ABS CONST EXT [010] UNTYP. __EXTERNS Solved Extern
crcval ABS CONST EXT [013] UNTYP. __EXTERNS Solved Extern
cset REL CONST PUB UNTYP. CODE 1C3E
ctoggle REL CONST PUB UNTYP. CODE 1C6E
dobran REL CONST UNTYP. CODE 566
docreate REL CONST PUB UNTYP. CODE 8A
dodoes REL CONST PUB UNTYP. CODE C6
donext REL CONST UNTYP. CODE 7C0
donoop REL CONST UNTYP. CODE 7C0
dotcold0 REL CONST UNTYP. CODE 1B09
dotcold1 REL CONST UNTYP. CODE 1B0E
green REL CONST PUB UNTYP. CODE 1D12
ih1 REL CONST UNTYP. CODE 1A38
infoB ABS CONST EXT [011] UNTYP. __EXTERNS Solved Extern
invalid REL CONST UNTYP. CODE 1ACE
lastword REL CONST PUB UNTYP. CODE 1D61
link REL VAR UNTYP. CODE 1D61
lit REL CONST PUB UNTYP. CODE 3A
ms1 REL CONST UNTYP. CODE 1C20
nullirq ABS CONST EXT [-001] UNTYP. __EXTERNS Solved Extern
onems1 REL CONST UNTYP. CODE 1BFE
onems2 REL CONST UNTYP. CODE 1C08
pcrc1 REL CONST UNTYP. CODE 1A02
pcrc2 REL CONST UNTYP. CODE 1A10
pcrc3 REL CONST UNTYP. CODE 1A12
qbran REL CONST PUB UNTYP. CODE 578
red REL CONST PUB UNTYP. CODE 1D02
reset REL CONST UNTYP. CODE 1ADC
valid REL CONST UNTYP. CODE 1ACC
ver0 REL CONST UNTYP. CODE 1
verend REL CONST UNTYP. CODE 1E
version REL CONST UNTYP. CODE 0
warm0 REL CONST UNTYP. CODE 1AFB
warm1 REL CONST UNTYP. CODE 1B00
wipmsg0 REL CONST UNTYP. CODE 1B53
wipmsg1 REL CONST UNTYP. CODE 1B5A
xdo REL CONST PUB UNTYP. CODE 58E
xloop REL CONST PUB UNTYP. CODE 5B4
xplusloop REL CONST PUB UNTYP. CODE 5D4
##############################
# CRC:8843 #
# Errors: 0 #
# Warnings: 0 #
# Bytes: 7532 #
##############################