- 4e-core430G2553 - Page 1 ############################################################################### # # # IAR Assembler V5.30.1.50284/W32 for MSP430 21/Dec/2013 07:09:19 # # Copyright 1996-2011 IAR Systems AB. # # # # Target option = MSP430 # # Source file = C:\Dokumente und Einstellungen\All Users\Dokumente\4e4th\4e-core430G2553.s43# # List file = C:\Dokumente und Einstellungen\All Users\Dokumente\4e4th\Debug\List\4e-core430G2553.lst# # Object file = C:\Dokumente und Einstellungen\All Users\Dokumente\4e4th\Debug\Obj\4e-core430G2553.r43# # Command line = C:\Dokumente und Einstellungen\All Users\Dokumente\4e4th\4e-core430G2553.s43 # # -OC:\Dokumente und Einstellungen\All Users\Dokumente\4e4th\Debug\Obj\ # # -s+ -M<> -w+ # # -LC:\Dokumente und Einstellungen\All Users\Dokumente\4e4th\Debug\List\ # # -i -p80 -t8 -xD -r -D__MSP430G2553__ # # -IC:\Programme\IAR Systems\Embedded Workbench 6.0 Kickstart\430\INC\ # # # ############################################################################### 1 000000 ; ---------------------------------------------- ------------------------ 2 000000 ; 4e4th is a Forth based on CamelForth 3 000000 ; for the Texas Instruments MSP430 4 000000 ; 5 000000 ; This program is free software; you can redistribute it and/or modify 6 000000 ; it under the terms of the GNU General Public License as published by 7 000000 ; the Free Software Foundation; either version 3 of the License, or 8 000000 ; (at your option) any later version. 9 000000 ; 10 000000 ; This program is distributed in the hope that it will be useful, 11 000000 ; but WITHOUT ANY WARRANTY; without even the implied warranty of 12 000000 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 000000 ; GNU General Public License for more details. 14 000000 ; 15 000000 ; You should have received a copy of the GNU General Public License 16 000000 ; along with this program. If not, see . 17 000000 ; 18 000000 ; See LICENSE TERMS in Brads file readme.txt as well. 19 000000 20 000000 ; ---------------------------------------------- ------------------------ 21 000000 ; 4e-core430.s43 - Machine Language Primitives - MSP430G2553 22 000000 ; ---------------------------------------------- ------------------------ 23 000000 24 000000 ; Revision History 25 000000 ; 1 mar 09 bjr - changed Flash write and erase primitives to correctly 26 000000 ; write RAM outside Info Flash and Main Flash address limits. 27 000000 28 000000 #include "msp430.h" ; #define controlled include file 1 000000 /*********************************************** ******************** 2 000000 * * 3 000000 * This file is a generic include file controlled by * 4 000000 * compiler/assembler IDE generated defines * 5 000000 * * 6 000000 ************************************************ *******************/ 7 000000 8 000000 #ifndef __msp430 9 000000 #define __msp430 - 4e-core430G2553 - Page 2 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__) - 4e-core430G2553 - Page 3 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__) - 4e-core430G2553 - Page 4 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__) - 4e-core430G2553 - Page 5 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__) - 4e-core430G2553 - Page 6 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__) - 4e-core430G2553 - Page 7 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__) - 4e-core430G2553 - Page 8 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__) - 4e-core430G2553 - Page 9 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__) - 4e-core430G2553 - Page 10 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; - 4e-core430G2553 - Page 11 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 - 4e-core430G2553 - Page 12 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__ /* - 4e-core430G2553 - Page 13 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- */ - 4e-core430G2553 - Page 14 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) /* - 4e-core430G2553 - Page 15 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) /* - 4e-core430G2553 - Page 16 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 */ - 4e-core430G2553 - Page 17 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 - 4e-core430G2553 - Page 18 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 - 4e-core430G2553 - Page 19 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__ /* - 4e-core430G2553 - Page 20 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_) - 4e-core430G2553 - Page 21 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 */ - 4e-core430G2553 - Page 22 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) /* - 4e-core430G2553 - Page 23 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 /*********************************************** - 4e-core430G2553 - Page 24 ************* 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 */ - 4e-core430G2553 - Page 25 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 */ - 4e-core430G2553 - Page 26 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 - 4e-core430G2553 - Page 27 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) /* - 4e-core430G2553 - Page 28 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 */ - 4e-core430G2553 - Page 29 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 - 4e-core430G2553 - Page 30 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 */ - 4e-core430G2553 - Page 31 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 - 4e-core430G2553 - Page 32 default include file" 1017 000000 #elif defined (__MSP430XGENERIC__) 1018 000000 #error "msp430X generic device does not have a default include file" 1024 000000 #else 1025 000000 #error "Failed to match a default include file" 1026 000000 #endif 1027 000000 1028 000000 #endif /* #ifndef __msp430 */ 1029 000000 29 000000 #include "4e-CF430G2553forth.h" ; header macros and register defs 1 000000 ; ---------------------------------------------- ------------------------ 2 000000 ; 4e4th is a Forth based on CamelForth 3 000000 ; for the Texas Instruments MSP430 4 000000 ; 5 000000 ; This program is free software; you can redistribute it and/or modify 6 000000 ; it under the terms of the GNU General Public License as published by 7 000000 ; the Free Software Foundation; either version 3 of the License, or 8 000000 ; (at your option) any later version. 9 000000 ; 10 000000 ; This program is distributed in the hope that it will be useful, 11 000000 ; but WITHOUT ANY WARRANTY; without even the implied warranty of 12 000000 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 000000 ; GNU General Public License for more details. 14 000000 ; 15 000000 ; You should have received a copy of the GNU General Public License 16 000000 ; along with this program. If not, see . 17 000000 ; 18 000000 ; See LICENSE TERMS in Brads file readme.txt as well. 19 000000 20 000000 ; ---------------------------------------------- ------------------------ 21 000000 ; 4e-CF430G2553forth.h: - Register, Model, Macro declarations - MSP430G2553 22 000000 ; ---------------------------------------------- ------------------------ 23 000000 24 000000 // ; FORTH MEMORY USAGE 25 000000 // ; for Flash memory operations - this includes information and main 26 000000 // ; ROM, but not the main ROM used by the kernel (above E000h) 27 000000 #define INFOSTART (0x1000) // ok mk 28 000000 #define INFOEND (0x10FF) // ok mk 29 000000 #define RAMSTART (0x0200) // ok mk 30 000000 #define RAMEND (0x0400) // ok mk 31 000000 #define USERFLASHSTART (0xC000) // ok mk 32 000000 #define USERFLASHEND (0xD7FF) // muss übereinstimmen mit -P CODE linker 33 000000 #define ISRSTART (0xFE00) 34 000000 #define ISREND (0xFFDF) 35 000000 #define MAINSEG (512) // wozu ?? mk 36 000000 #define INFOSEG (128) // ?? mk 37 000000 38 000000 // ; FORTH REGISTER USAGE 39 000000 40 000000 // ; Forth virtual machine 41 000000 // PC = R00 42 000000 #define RSP SP // R01 43 000000 // R02 = SR statusregister 44 000000 // R03 = CG constantgenerator 45 000000 #define PSP R4 46 000000 #define IP R5 47 000000 #define W R6 - 4e-core430G2553 - Page 33 48 000000 #define TOS R7 49 000000 50 000000 // ; Loop parameters in registers 51 000000 #define INDEX R8 52 000000 #define LIMIT R9 53 000000 54 000000 // ; Scratch registers 55 000000 #define X R10 56 000000 #define Y R11 57 000000 #define Q R12 58 000000 #define T R13 59 000000 // nc R14 60 000000 // nc R15 61 000000 62 000000 63 000000 // ; T.I. Integer Subroutines Definitions 64 000000 #define IROP1 TOS 65 000000 #define IROP2L R10 66 000000 #define IROP2M R11 67 000000 #define IRACL R12 68 000000 #define IRACM R13 69 000000 #define IRBT W 70 000000 71 000000 // ; INDIRECT-THREADED NEXT 72 000000 77 000000 78 000000 // ; BRANCH DESTINATION (RELATIVE BRANCH) 79 000000 // ; For relative branch addresses, i.e., a branch is ADD @IP,IP 80 000000 84 000000 85 000000 // ; HEADER CONSTRUCTION MACROS 86 000000 101 000000 110 000000 125 000000 30 000000 31 000000 EXTERN UP,UAREA,PADAREA,LSTACK,PSTACK,R STACK 32 000000 EXTERN TIBAREA,RAMDICT,ROMDICT 33 000000 EXTERN TIB_SIZE,UAREA_SIZE,VARAREA,VAR_ SIZE,nullirq 34 000000 35 000000 RSEG CODE ; place program in 'CODE' segment 36 000000 37 000000 link SET 0 ; initial dictionary link 38 000000 39 000000 ; production fuse bits 40 000000 FFFF PROFUSE: DW 0xFFFF ; burn fuse to prohibit WIPE 41 000002 42 000002 43 000002 13 version: DB (verend-ver0) 44 000003 204D53503433*ver0: DB ' MSP430G2553 4E4th ' 45 000016 EVEN 0x20 ; use blank as padding byte 46 000016 verend: 47 000016 48 000016 16 stamp: DB (stampend-stamp0) 49 000017 446563203231*stamp0: DB __date__,' ',__time__ 50 00002D stampend: 51 00002D 52 00002D /* 53 00002D id: DB (idend-id0) 54 00002D id0: DB 'MSP430G2553 ' 55 00002D EVEN 0x20 ; use blank as padding byte 56 00002D idend: 57 00002D */ 58 00002D 59 00002D ; ---------------------------------------------- ------------------------ 60 00002D ; INTERPRETER LOGIC 61 00002D ; ITC NEXT is defined as 62 00002D ; MOV @IP+,W ; 2 fetch word address into W - 4e-core430G2553 - Page 34 63 00002D ; MOV @W+,PC ; 2 fetch code address into PC, W=PFA 64 00002D 65 00002D ;C EXECUTE i*x xt -- j*x execute Forth word at 'xt' 66 00002D HEADER EXECUTE,7,'EXECUTE',DOCODE 66.1 000000 PUBLIC EXECUTE 66.2 00002D 0000 DW link 66.3 00002F FF DB 0FFh ; not immediate 66.4 000030 link SET $ 66.5 000030 07 DB 7 66.6 000031 455845435554* DB 'EXECUTE' 66.7 000038 EVEN 66.8 000038 IF 'DOCODE'='DOCODE' 66.9 000038 .... EXECUTE: DW $+2 66.10 00003A ELSE 66.11 00003A EXECUTE: DW DOCODE 66.12 00003A ENDIF 66.13 00003A ENDM 67 00003A 0647 MOV TOS,W ; 1 put word address into W 68 00003C 3744 MOV @PSP+,TOS ; 2 fetch new TOS 69 00003E 3046 MOV @W+,PC ; 2 fetch code address into PC, W=PFA 70 000040 71 000040 ;Z lit -- x fetch inline literal to stack 72 000040 ; This is the primtive compiled by LITERAL. 73 000040 HEADER lit,3,'lit',DOCODE 73.1 000000 PUBLIC lit 73.2 000040 .... DW link 73.3 000042 FF DB 0FFh ; not immediate 73.4 000043 link SET $ 73.5 000043 03 DB 3 73.6 000044 6C6974 DB 'lit' 73.7 000047 00 EVEN 73.8 000048 IF 'DOCODE'='DOCODE' 73.9 000048 .... lit: DW $+2 73.10 00004A ELSE 73.11 00004A lit: DW DOCODE 73.12 00004A ENDIF 73.13 00004A ENDM 74 00004A 2483 SUB #2,PSP ; 1 push old TOS.. 75 00004C 84470000 MOV TOS,0(PSP) ; 4 ..onto stack 76 000050 3745 MOV @IP+,TOS ; 2 fetch new TOS value 77 000052 NEXT ; 4 77.1 000052 3645 MOV @IP+,W // ; fetch word address into W 77.2 000054 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 77.3 000056 ENDM 78 000056 79 000056 ;C EXIT -- exit a colon definition 80 000056 HEADER EXIT,4,'EXIT',DOCODE 80.1 000000 PUBLIC EXIT 80.2 000056 .... DW link 80.3 000058 FF DB 0FFh ; not immediate 80.4 000059 link SET $ 80.5 000059 04 DB 4 80.6 00005A 45584954 DB 'EXIT' 80.7 00005E EVEN 80.8 00005E IF 'DOCODE'='DOCODE' 80.9 00005E .... EXIT: DW $+2 80.10 000060 ELSE 80.11 000060 EXIT: DW DOCODE 80.12 000060 ENDIF 80.13 000060 ENDM 81 000060 3541 MOV @RSP+,IP ; 2 pop old IP from return stack 82 000062 NEXT ; 4 82.1 000062 3645 MOV @IP+,W // ; fetch word address into W 82.2 000064 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 82.3 000066 ENDM 83 000066 - 4e-core430G2553 - Page 35 84 000066 ; ---------------------------------------------- ------------------------ 85 000066 ; DEFINING WORDS - ROMable ITC model 86 000066 87 000066 ; DOCOLON enters a new high-level thread (colon definition.) 88 000066 ; (internal code fragment, not a Forth word) 89 000000 PUBLIC DOCOLON 90 000066 DOCOLON: 91 000066 0512 PUSH IP ; 3 save old IP on return stack 92 000068 0546 MOV W,IP ; 1 set new IP to PFA 93 00006A NEXT ; 4 93.1 00006A 3645 MOV @IP+,W // ; fetch word address into W 93.2 00006C 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 93.3 00006E ENDM 94 00006E 95 00006E ;C VARIABLE -- define a Forth VARIABLE 96 00006E ; CREATE CELL ALLOT ; 97 00006E ; Action of ROMable variable is the same as CREATE; it builds a 98 00006E ; constant holding the RAM address. See CREATE in hilvl430.s43. 99 00006E HEADER VARIABLE,8,'VARIABLE',DOCOLON 99.1 000000 PUBLIC VARIABLE 99.2 00006E .... DW link 99.3 000070 FF DB 0FFh ; not immediate 99.4 000071 link SET $ 99.5 000071 08 DB 8 99.6 000072 564152494142* DB 'VARIABLE' 99.7 00007A EVEN 99.8 00007A IF 'DOCOLON'='DOCODE' 99.9 00007A VARIABLE: DW $+2 99.10 00007A ELSE 99.11 00007A .... VARIABLE: DW DOCOLON 99.12 00007C ENDIF 99.13 00007C ENDM 100 00007C ............* DW CREATE,CELL,ALLOT,EXIT 101 000084 102 000084 ;C CONSTANT -- define a Forth constant 103 000084 ; (machine code fragment) 105 000084 ; Note that the constant is stored in Code space. 106 000084 HEADER CONSTANT,8,'CONSTANT',DOCOLON 106.1 000000 PUBLIC CONSTANT 106.2 000084 .... DW link 106.3 000086 FF DB 0FFh ; not immediate 106.4 000087 link SET $ 106.5 000087 08 DB 8 106.6 000088 434F4E535441* DB 'CONSTANT' 106.7 000090 EVEN 106.8 000090 IF 'DOCOLON'='DOCODE' 106.9 000090 CONSTANT: DW $+2 106.10 000090 ELSE 106.11 000090 .... CONSTANT: DW DOCOLON 106.12 000092 ENDIF 106.13 000092 ENDM 107 000092 ............ DW BUILDS,ICOMMA,XDOES 108 000098 ; DOCON, code action of CONSTANT, 109 000098 ; entered with W=Parameter Field Adrs 110 000098 ; This is also the action of VARIABLE (Harvard model) 111 000098 ; This is also the action of CREATE (Harvard model) 112 000000 PUBLIC DOCON 113 000000 PUBLIC docreate 114 000000 PUBLIC DOVAR 115 000098 docreate: ; -- a-addr ; ROMable CREATE fetches address from PFA 116 000098 DOVAR: ; -- a-addr ; ROMable VARIABLE fetches address from PFA - 4e-core430G2553 - Page 36 117 000098 DOCON: ; -- x ; CONSTANT fetches cell from PFA to TOS 118 000098 2483 SUB #2,PSP ; make room on stack 119 00009A 84470000 MOV TOS,0(PSP) 120 00009E 2746 MOV @W,TOS ; fetch from parameter field to TOS 121 0000A0 NEXT 121.1 0000A0 3645 MOV @IP+,W // ; fetch word address into W 121.2 0000A2 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 121.3 0000A4 ENDM 122 0000A4 123 0000A4 ; DOCREATE's action is for a table in RAM. 124 0000A4 ; DOROM is the code action for a table in ROM; 125 0000A4 ; it returns the address of the parameter field. 126 000000 PUBLIC DOROM 127 0000A4 DOROM: ; -- a-addr ; Table in ROM: get PFA into TOS 128 0000A4 2483 SUB #2,PSP 129 0000A6 84470000 MOV TOS,0(PSP) 130 0000AA 0746 MOV W,TOS 131 0000AC NEXT 131.1 0000AC 3645 MOV @IP+,W // ; fetch word address into W 131.2 0000AE 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 131.3 0000B0 ENDM 132 0000B0 133 0000B0 ;Z USER n -- define user variable 'n' 134 0000B0 ; (machine code fragment) Flashable model 135 0000B0 HEADER USER,4,'USER',DOCOLON 135.1 000000 PUBLIC USER 135.2 0000B0 .... DW link 135.3 0000B2 FF DB 0FFh ; not immediate 135.4 0000B3 link SET $ 135.5 0000B3 04 DB 4 135.6 0000B4 55534552 DB 'USER' 135.7 0000B8 EVEN 135.8 0000B8 IF 'DOCOLON'='DOCODE' 135.9 0000B8 USER: DW $+2 135.10 0000B8 ELSE 135.11 0000B8 .... USER: DW DOCOLON 135.12 0000BA ENDIF 135.13 0000BA ENDM 136 0000BA ............ DW BUILDS,ICOMMA,XDOES 137 000000 PUBLIC DOUSER 138 0000C0 DOUSER: ; -- a-addr ; add constant to User Pointer, result in TOS 139 0000C0 2483 SUB #2,PSP 140 0000C2 84470000 MOV TOS,0(PSP) 141 0000C6 2746 MOV @W,TOS 142 0000C8 1752.... ADD &UP,TOS 143 0000CC NEXT 143.1 0000CC 3645 MOV @IP+,W // ; fetch word address into W 143.2 0000CE 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 143.3 0000D0 ENDM 144 0000D0 145 0000D0 ; DOALIAS used to build a word which performs the action of 146 0000D0 ; another word. Its action is to fetch the "alias" CFA from 147 0000D0 ; the parameter field, and execute that, e.g. DOES> I@ EXECUTE ; 148 0000D0 ; This is currently used only within the Forth kernel. 149 000000 PUBLIC DOALIAS 150 0000D0 DOALIAS: ; -- ; fetch CFA of word to execute 151 0000D0 2646 MOV @W,W ; 2 fetch from parameter field to W - 4e-core430G2553 - Page 37 152 0000D2 3046 MOV @W+,PC ; 2 fetch code address into PC, W=PFA 153 0000D4 154 0000D4 ; DODOES is the code action of a DOES> clause. For ITC Forth: 155 0000D4 ; defined word: CFA: doescode 156 0000D4 ; PFA: parameter field 157 0000D4 ; 158 0000D4 ; doescode: MOV #DODOES,PC ; 16-bit direct jump, in two cells 159 0000D4 ; high-level thread 160 0000D4 ; 161 0000D4 ; Note that we use JMP DODOES instead of CALL #DODOES because we can 162 0000D4 ; efficiently obtain the thread address. DODOES is entered with W=PFA. 163 0000D4 ; It enters the high-level thread with the address of the parameter 164 0000D4 ; field on top of stack. 165 0000D4 166 000000 PUBLIC dodoes 167 0000D4 dodoes: ; -- a-addr ; 3 for MOV #DODOES,PC 168 0000D4 2483 SUB #2,PSP ; 1 make room on stack 169 0000D6 84470000 MOV TOS,0(PSP) ; 4 170 0000DA 0746 MOV W,TOS ; 1 put defined word's PFA in TOS 171 0000DC 0512 PUSH IP ; 3 save old IP on return stack 172 0000DE 1546FEFF MOV -2(W),IP ; 3 fetch adrs of doescode from defined word 173 0000E2 2552 ADD #4,IP ; 1 skip MOV instruction to get thread adrs 174 0000E4 NEXT ; 4 174.1 0000E4 3645 MOV @IP+,W // ; fetch word address into W 174.2 0000E6 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 174.3 0000E8 ENDM 175 0000E8 176 0000E8 ; OPTION 1 ; OPTION 2 177 0000E8 ; MOV #DODOES,PC 3 ; CALL #DODOES 5 178 0000E8 ; ... ; ... 179 0000E8 ; PUSH IP 3 ; POP W 2 180 0000E8 ; MOVE -2(W),IP 3 ; PUSH IP 3 181 0000E8 ; ADD #4,IP 1 ; MOV W,IP 1 182 0000E8 183 0000E8 184 0000E8 ; ---------------------------------------------- ------------------------ 185 0000E8 ; STACK OPERATIONS 186 0000E8 187 0000E8 ;C DUP x -- x x duplicate top of stack 188 0000E8 HEADER DUP,3,'DUP',DOCODE 188.1 000000 PUBLIC DUP 188.2 0000E8 .... DW link 188.3 0000EA FF DB 0FFh ; not immediate 188.4 0000EB link SET $ 188.5 0000EB 03 DB 3 188.6 0000EC 445550 DB 'DUP' 188.7 0000EF 00 EVEN 188.8 0000F0 IF 'DOCODE'='DOCODE' 188.9 0000F0 .... DUP: DW $+2 188.10 0000F2 ELSE 188.11 0000F2 DUP: DW DOCODE 188.12 0000F2 ENDIF 188.13 0000F2 ENDM 189 0000F2 2483 PUSHTOS: SUB #2,PSP ; 1 push old TOS.. 190 0000F4 84470000 MOV TOS,0(PSP) ; 4 ..onto stack - 4e-core430G2553 - Page 38 191 0000F8 NEXT ; 4 191.1 0000F8 3645 MOV @IP+,W // ; fetch word address into W 191.2 0000FA 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 191.3 0000FC ENDM 192 0000FC 193 0000FC ;C ?DUP x -- 0 | x x DUP if nonzero 194 0000FC HEADER QDUP,4,'?DUP',DOCODE 194.1 000000 PUBLIC QDUP 194.2 0000FC .... DW link 194.3 0000FE FF DB 0FFh ; not immediate 194.4 0000FF link SET $ 194.5 0000FF 04 DB 4 194.6 000100 3F445550 DB '?DUP' 194.7 000104 EVEN 194.8 000104 IF 'DOCODE'='DOCODE' 194.9 000104 .... QDUP: DW $+2 194.10 000106 ELSE 194.11 000106 QDUP: DW DOCODE 194.12 000106 ENDIF 194.13 000106 ENDM 195 000106 0793 CMP #0,TOS ; 1 test for TOS nonzero 196 000108 F423 JNZ PUSHTOS ; 2 197 00010A NODUP: NEXT ; 4 197.1 00010A 3645 MOV @IP+,W // ; fetch word address into W 197.2 00010C 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 197.3 00010E ENDM 198 00010E 199 00010E ;C DROP x -- drop top of stack 200 00010E HEADER DROP,4,'DROP',DOCODE 200.1 000000 PUBLIC DROP 200.2 00010E .... DW link 200.3 000110 FF DB 0FFh ; not immediate 200.4 000111 link SET $ 200.5 000111 04 DB 4 200.6 000112 44524F50 DB 'DROP' 200.7 000116 EVEN 200.8 000116 IF 'DOCODE'='DOCODE' 200.9 000116 .... DROP: DW $+2 200.10 000118 ELSE 200.11 000118 DROP: DW DOCODE 200.12 000118 ENDIF 200.13 000118 ENDM 201 000118 3744 MOV @PSP+,TOS ; 2 202 00011A NEXT ; 4 202.1 00011A 3645 MOV @IP+,W // ; fetch word address into W 202.2 00011C 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 202.3 00011E ENDM 203 00011E 204 00011E ;C SWAP x1 x2 -- x2 x1 swap top two items 205 00011E HEADER SWAP,4,'SWAP',DOCODE 205.1 000000 PUBLIC SWAP 205.2 00011E .... DW link 205.3 000120 FF DB 0FFh ; not immediate 205.4 000121 link SET $ 205.5 000121 04 DB 4 205.6 000122 53574150 DB 'SWAP' 205.7 000126 EVEN 205.8 000126 IF 'DOCODE'='DOCODE' 205.9 000126 .... SWAP: DW $+2 205.10 000128 ELSE 205.11 000128 SWAP: DW DOCODE 205.12 000128 ENDIF 205.13 000128 ENDM 206 000128 2644 MOV @PSP,W ; 2 - 4e-core430G2553 - Page 39 207 00012A 84470000 MOV TOS,0(PSP) ; 4 208 00012E 0746 MOV W,TOS ; 1 209 000130 NEXT ; 4 209.1 000130 3645 MOV @IP+,W // ; fetch word address into W 209.2 000132 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 209.3 000134 ENDM 210 000134 211 000134 ;C OVER x1 x2 -- x1 x2 x1 per stack diagram 212 000134 HEADER OVER,4,'OVER',DOCODE 212.1 000000 PUBLIC OVER 212.2 000134 .... DW link 212.3 000136 FF DB 0FFh ; not immediate 212.4 000137 link SET $ 212.5 000137 04 DB 4 212.6 000138 4F564552 DB 'OVER' 212.7 00013C EVEN 212.8 00013C IF 'DOCODE'='DOCODE' 212.9 00013C .... OVER: DW $+2 212.10 00013E ELSE 212.11 00013E OVER: DW DOCODE 212.12 00013E ENDIF 212.13 00013E ENDM 213 00013E 2644 MOV @PSP,W ; 2 214 000140 2483 SUB #2,PSP ; 2 215 000142 84470000 MOV TOS,0(PSP) ; 4 216 000146 0746 MOV W,TOS ; 1 217 000148 NEXT ; 4 217.1 000148 3645 MOV @IP+,W // ; fetch word address into W 217.2 00014A 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 217.3 00014C ENDM 218 00014C 219 00014C ;C ROT x1 x2 x3 -- x2 x3 x1 per stack diagram 220 00014C HEADER ROT,3,'ROT',DOCODE 220.1 000000 PUBLIC ROT 220.2 00014C .... DW link 220.3 00014E FF DB 0FFh ; not immediate 220.4 00014F link SET $ 220.5 00014F 03 DB 3 220.6 000150 524F54 DB 'ROT' 220.7 000153 00 EVEN 220.8 000154 IF 'DOCODE'='DOCODE' 220.9 000154 .... ROT: DW $+2 220.10 000156 ELSE 220.11 000156 ROT: DW DOCODE 220.12 000156 ENDIF 220.13 000156 ENDM 221 000156 2644 MOV @PSP,W ; 2 fetch x2 222 000158 84470000 MOV TOS,0(PSP) ; 4 store x3 223 00015C 17440200 MOV 2(PSP),TOS ; 3 fetch x1 224 000160 84460200 MOV W,2(PSP) ; 4 store x2 225 000164 NEXT ; 4 225.1 000164 3645 MOV @IP+,W // ; fetch word address into W 225.2 000166 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 225.3 000168 ENDM 226 000168 227 000168 ;X NIP x1 x2 -- x2 per stack diagram 228 000168 HEADER NIP,3,'NIP',DOCODE 228.1 000000 PUBLIC NIP 228.2 000168 .... DW link - 4e-core430G2553 - Page 40 228.3 00016A FF DB 0FFh ; not immediate 228.4 00016B link SET $ 228.5 00016B 03 DB 3 228.6 00016C 4E4950 DB 'NIP' 228.7 00016F 00 EVEN 228.8 000170 IF 'DOCODE'='DOCODE' 228.9 000170 .... NIP: DW $+2 228.10 000172 ELSE 228.11 000172 NIP: DW DOCODE 228.12 000172 ENDIF 228.13 000172 ENDM 229 000172 2453 ADD #2,PSP ; 1 230 000174 NEXT ; 4 230.1 000174 3645 MOV @IP+,W // ; fetch word address into W 230.2 000176 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 230.3 000178 ENDM 231 000178 ; Das funktioniert, weil TOS im Register ist. 232 000178 ; TOS beleibt dort unverändert, derweil der PSP um eins erhöht wird. 233 000178 ; Das entspricht einem DROP ohne den TOS neu zu laden. 234 000178 ; cool. mk 235 000178 236 000178 ;C >R x -- R: -- x push to return stack 237 000178 HEADER TOR,2,'>R',DOCODE 237.1 000000 PUBLIC TOR 237.2 000178 .... DW link 237.3 00017A FF DB 0FFh ; not immediate 237.4 00017B link SET $ 237.5 00017B 02 DB 2 237.6 00017C 3E52 DB '>R' 237.7 00017E EVEN 237.8 00017E IF 'DOCODE'='DOCODE' 237.9 00017E .... TOR: DW $+2 237.10 000180 ELSE 237.11 000180 TOR: DW DOCODE 237.12 000180 ENDIF 237.13 000180 ENDM 238 000180 0712 PUSH TOS 239 000182 3744 MOV @PSP+,TOS 240 000184 NEXT 240.1 000184 3645 MOV @IP+,W // ; fetch word address into W 240.2 000186 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 240.3 000188 ENDM 241 000188 242 000188 ;C R> -- x R: x -- pop from return stack 243 000188 HEADER RFROM,2,'R>',DOCODE 243.1 000000 PUBLIC RFROM 243.2 000188 .... DW link 243.3 00018A FF DB 0FFh ; not immediate 243.4 00018B link SET $ 243.5 00018B 02 DB 2 243.6 00018C 523E DB 'R>' 243.7 00018E EVEN 243.8 00018E IF 'DOCODE'='DOCODE' 243.9 00018E .... RFROM: DW $+2 243.10 000190 ELSE 243.11 000190 RFROM: DW DOCODE 243.12 000190 ENDIF 243.13 000190 ENDM 244 000190 2483 SUB #2,PSP ; 2 245 000192 84470000 MOV TOS,0(PSP) ; 4 246 000196 3741 MOV @RSP+,TOS 247 000198 NEXT 247.1 000198 3645 MOV @IP+,W // ; fetch word address into W 247.2 00019A 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 247.3 00019C ENDM - 4e-core430G2553 - Page 41 248 00019C 249 00019C ;C R@ -- x R: x -- x fetch from rtn stk 250 00019C HEADER RFETCH,2,'R@',DOCODE 250.1 000000 PUBLIC RFETCH 250.2 00019C .... DW link 250.3 00019E FF DB 0FFh ; not immediate 250.4 00019F link SET $ 250.5 00019F 02 DB 2 250.6 0001A0 5240 DB 'R@' 250.7 0001A2 EVEN 250.8 0001A2 IF 'DOCODE'='DOCODE' 250.9 0001A2 .... RFETCH: DW $+2 250.10 0001A4 ELSE 250.11 0001A4 RFETCH: DW DOCODE 250.12 0001A4 ENDIF 250.13 0001A4 ENDM 251 0001A4 2483 SUB #2,PSP 252 0001A6 84470000 MOV TOS,0(PSP) 253 0001AA 2741 MOV @RSP,TOS 254 0001AC NEXT 254.1 0001AC 3645 MOV @IP+,W // ; fetch word address into W 254.2 0001AE 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 254.3 0001B0 ENDM 255 0001B0 256 0001B0 ;Z SP@ -- a-addr get data stack pointer 257 0001B0 HEADER SPFETCH,3,'SP@',DOCODE 257.1 000000 PUBLIC SPFETCH 257.2 0001B0 .... DW link 257.3 0001B2 FF DB 0FFh ; not immediate 257.4 0001B3 link SET $ 257.5 0001B3 03 DB 3 257.6 0001B4 535040 DB 'SP@' 257.7 0001B7 00 EVEN 257.8 0001B8 IF 'DOCODE'='DOCODE' 257.9 0001B8 .... SPFETCH: DW $+2 257.10 0001BA ELSE 257.11 0001BA SPFETCH: DW DOCODE 257.12 0001BA ENDIF 257.13 0001BA ENDM 258 0001BA 2483 SUB #2,PSP 259 0001BC 84470000 MOV TOS,0(PSP) 260 0001C0 0744 MOV PSP,TOS 261 0001C2 NEXT 261.1 0001C2 3645 MOV @IP+,W // ; fetch word address into W 261.2 0001C4 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 261.3 0001C6 ENDM 262 0001C6 263 0001C6 ;Z SP! a-addr -- set data stack pointer 264 0001C6 HEADER SPSTORE,3,'SP!',DOCODE 264.1 000000 PUBLIC SPSTORE 264.2 0001C6 .... DW link 264.3 0001C8 FF DB 0FFh ; not immediate 264.4 0001C9 link SET $ 264.5 0001C9 03 DB 3 264.6 0001CA 535021 DB 'SP!' 264.7 0001CD 00 EVEN 264.8 0001CE IF 'DOCODE'='DOCODE' 264.9 0001CE .... SPSTORE: DW $+2 264.10 0001D0 ELSE 264.11 0001D0 SPSTORE: DW DOCODE 264.12 0001D0 ENDIF 264.13 0001D0 ENDM 265 0001D0 0447 MOV TOS,PSP 266 0001D2 3744 MOV @PSP+,TOS ; 2 267 0001D4 NEXT 267.1 0001D4 3645 MOV @IP+,W // ; fetch word address into W 267.2 0001D6 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 267.3 0001D8 ENDM 268 0001D8 - 4e-core430G2553 - Page 42 269 0001D8 ;Z RP@ -- a-addr get return stack pointer 270 0001D8 HEADER RPFETCH,3,'RP@',DOCODE 270.1 000000 PUBLIC RPFETCH 270.2 0001D8 .... DW link 270.3 0001DA FF DB 0FFh ; not immediate 270.4 0001DB link SET $ 270.5 0001DB 03 DB 3 270.6 0001DC 525040 DB 'RP@' 270.7 0001DF 00 EVEN 270.8 0001E0 IF 'DOCODE'='DOCODE' 270.9 0001E0 .... RPFETCH: DW $+2 270.10 0001E2 ELSE 270.11 0001E2 RPFETCH: DW DOCODE 270.12 0001E2 ENDIF 270.13 0001E2 ENDM 271 0001E2 2483 SUB #2,PSP 272 0001E4 84470000 MOV TOS,0(PSP) 273 0001E8 0741 MOV RSP,TOS 274 0001EA NEXT 274.1 0001EA 3645 MOV @IP+,W // ; fetch word address into W 274.2 0001EC 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 274.3 0001EE ENDM 275 0001EE 276 0001EE ;Z RP! a-addr -- set return stack pointer 277 0001EE HEADER RPSTORE,3,'RP!',DOCODE 277.1 000000 PUBLIC RPSTORE 277.2 0001EE .... DW link 277.3 0001F0 FF DB 0FFh ; not immediate 277.4 0001F1 link SET $ 277.5 0001F1 03 DB 3 277.6 0001F2 525021 DB 'RP!' 277.7 0001F5 00 EVEN 277.8 0001F6 IF 'DOCODE'='DOCODE' 277.9 0001F6 .... RPSTORE: DW $+2 277.10 0001F8 ELSE 277.11 0001F8 RPSTORE: DW DOCODE 277.12 0001F8 ENDIF 277.13 0001F8 ENDM 278 0001F8 0147 MOV TOS,RSP 279 0001FA 3744 MOV @PSP+,TOS ; 2 280 0001FC NEXT 280.1 0001FC 3645 MOV @IP+,W // ; fetch word address into W 280.2 0001FE 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 280.3 000200 ENDM 281 000200 282 000200 ;X TUCK x1 x2 -- x2 x1 x2 per stack diagram 283 000200 HEADER TUCK,4,'TUCK',DOCOLON 283.1 000000 PUBLIC TUCK 283.2 000200 .... DW link 283.3 000202 FF DB 0FFh ; not immediate 283.4 000203 link SET $ 283.5 000203 04 DB 4 283.6 000204 5455434B DB 'TUCK' 283.7 000208 EVEN 283.8 000208 IF 'DOCOLON'='DOCODE' 283.9 000208 TUCK: DW $+2 283.10 000208 ELSE 283.11 000208 .... TUCK: DW DOCOLON 283.12 00020A ENDIF 283.13 00020A ENDM 284 00020A ............ DC16 SWAP,OVER,EXIT 285 000210 286 000210 ; ---------------------------------------------- ------------------------ 287 000210 ; MEMORY OPERATIONS 288 000210 289 000210 ;C @ a-addr -- x fetch cell from memory 290 000210 HEADER FETCH,1,'@',DOCODE 290.1 000000 PUBLIC FETCH 290.2 000210 .... DW link - 4e-core430G2553 - Page 43 290.3 000212 FF DB 0FFh ; not immediate 290.4 000213 link SET $ 290.5 000213 01 DB 1 290.6 000214 40 DB '@' 290.7 000215 00 EVEN 290.8 000216 IF 'DOCODE'='DOCODE' 290.9 000216 .... FETCH: DW $+2 290.10 000218 ELSE 290.11 000218 FETCH: DW DOCODE 290.12 000218 ENDIF 290.13 000218 ENDM 291 000218 2747 MOV @TOS,TOS 292 00021A NEXT 292.1 00021A 3645 MOV @IP+,W // ; fetch word address into W 292.2 00021C 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 292.3 00021E ENDM 293 00021E 294 00021E ;C ! x a-addr -- store cell in memory 295 00021E HEADER STORE,1,'!',DOCODE 295.1 000000 PUBLIC STORE 295.2 00021E .... DW link 295.3 000220 FF DB 0FFh ; not immediate 295.4 000221 link SET $ 295.5 000221 01 DB 1 295.6 000222 21 DB '!' 295.7 000223 00 EVEN 295.8 000224 IF 'DOCODE'='DOCODE' 295.9 000224 .... STORE: DW $+2 295.10 000226 ELSE 295.11 000226 STORE: DW DOCODE 295.12 000226 ENDIF 295.13 000226 ENDM 296 000226 B7440000 MOV @PSP+,0(TOS) 297 00022A 3744 MOV @PSP+,TOS 298 00022C NEXT 298.1 00022C 3645 MOV @IP+,W // ; fetch word address into W 298.2 00022E 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 298.3 000230 ENDM 299 000230 300 000230 ;C C@ c-addr -- char fetch char from memory 301 000230 HEADER CFETCH,2,'C@',DOCODE 301.1 000000 PUBLIC CFETCH 301.2 000230 .... DW link 301.3 000232 FF DB 0FFh ; not immediate 301.4 000233 link SET $ 301.5 000233 02 DB 2 301.6 000234 4340 DB 'C@' 301.7 000236 EVEN 301.8 000236 IF 'DOCODE'='DOCODE' 301.9 000236 .... CFETCH: DW $+2 301.10 000238 ELSE 301.11 000238 CFETCH: DW DOCODE 301.12 000238 ENDIF 301.13 000238 ENDM 302 000238 6747 MOV.B @TOS,TOS 303 00023A NEXT 303.1 00023A 3645 MOV @IP+,W // ; fetch word address into W 303.2 00023C 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 303.3 00023E ENDM 304 00023E 305 00023E ;C C! char c-addr -- store char in memory 306 00023E HEADER CSTORE,2,'C!',DOCODE 306.1 000000 PUBLIC CSTORE 306.2 00023E .... DW link 306.3 000240 FF DB 0FFh ; not immediate 306.4 000241 link SET $ 306.5 000241 02 DB 2 306.6 000242 4321 DB 'C!' 306.7 000244 EVEN - 4e-core430G2553 - Page 44 306.8 000244 IF 'DOCODE'='DOCODE' 306.9 000244 .... CSTORE: DW $+2 306.10 000246 ELSE 306.11 000246 CSTORE: DW DOCODE 306.12 000246 ENDIF 306.13 000246 ENDM 307 000246 3644 MOV @PSP+,W 308 000248 C7460000 MOV.B W,0(TOS) 309 00024C 3744 MOV @PSP+,TOS 310 00024E NEXT 310.1 00024E 3645 MOV @IP+,W // ; fetch word address into W 310.2 000250 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 310.3 000252 ENDM 311 000252 312 000252 ; FLASH MEMORY OPERATIONS 313 000252 ; Note that an I! or IC! to a RAM address >FLASHSTART will work -- it 314 000252 ; will enable the flash, write the RAM, and then disable the flash. 315 000252 ; An FLERASE to a RAM address will merely clear that one RAM cell. 316 000252 317 000252 ;Z FLERASE a-addr n -- erase n bytes of flash, full segment sizes. 318 000252 HEADER FLERASE,7,'FLERASE',DOCODE 318.1 000000 PUBLIC FLERASE 318.2 000252 .... DW link 318.3 000254 FF DB 0FFh ; not immediate 318.4 000255 link SET $ 318.5 000255 07 DB 7 318.6 000256 464C45524153* DB 'FLERASE' 318.7 00025D 00 EVEN 318.8 00025E IF 'DOCODE'='DOCODE' 318.9 00025E .... FLERASE: DW $+2 318.10 000260 ELSE 318.11 000260 FLERASE: DW DOCODE 318.12 000260 ENDIF 318.13 000260 ENDM 319 000260 3644 MOV @PSP+,W ; get address in W 320 000262 0756 ADD W,TOS ; TOS=end adrs (first unerased adrs) 321 000264 FLE_1: 322 000264 0697 CMP TOS,W ; adr-end 323 000266 2E2C JC FLE_X ; if no borrow, adr>=end, do not erase 324 000268 ; is it within Main flash? 325 000268 369000C0 CMP #USERFLASHSTART,W ; flash start 326 00026C 0328 JNC FLE_VEC ; if borrow, adrend, check if vec 329 000274 330 000274 FLE_VEC 331 000274 ; danger!! only for MSPG2553 apps 332 000274 ; is it within interrupt vector flash? 333 000274 369000FE CMP #ISRSTART,W ; flash start 334 000278 0328 JNC FLE_INFO ; if borrow, adrend, check if Info 337 000280 ; /danger - 4e-core430G2553 - Page 45 338 000280 339 000280 FLE_INFO: ; is it within Info flash? 340 000280 36900010 CMP #INFOSTART,W 341 000284 1F28 JNC FLE_X ; if borrow, adrend, do not erase 344 00028C FLE_OK: ; Address is either in Main flash, or in Info flash. 345 00028C ; Segment Erase from flash. 346 00028C ; Assumes ACCVIE = NMIIE = OFIE = 0, watchdog disabled. 347 00028C ; Per section 5.3.2 of MSP430 Family User's Guide 348 00028C 0212 PUSH sr 349 00028E 32C2 DINT ; Disable interrupts 350 000290 B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear LOCK 351 000296 B24002A52801 MOV #FWKEY+ERASE,&FCTL1 ; Enable segment erase 352 00029C B6430000 MOV #-1,0(W) ; Dummy write in segment to erase 353 0002A0 B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear erase command. 354 0002A6 B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Done, set LOCK 355 0002AC ; EINT ; Enable interrupts 356 0002AC 3241 POP sr 357 0002AE ; Advance flash pointer by 512 bytes or 128 bytes 358 0002AE ; is it within Main flash? 359 0002AE 369000C0 CMP #USERFLASHSTART,W 360 0002B2 0528 JNC FL_INFO ; if borrow, adrend, must be Info 363 0002BA 36508001 ADD #(MAINSEG-INFOSEG),W 364 0002BE 36508000 FL_INFO: ADD #INFOSEG,W 365 0002C2 D03F JMP FLE_1 ; continue till past end or outside limits 366 0002C4 3744 FLE_X: MOV @PSP+,TOS 367 0002C6 NEXT 367.1 0002C6 3645 MOV @IP+,W // ; fetch word address into W 367.2 0002C8 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 367.3 0002CA ENDM 368 0002CA 369 0002CA ; Program Space (Flash) operators 370 0002CA 371 0002CA ;Z I! x a-addr -- store cell in Instruction memory 372 0002CA HEADER ISTORE,2,'I!',DOCODE 372.1 000000 PUBLIC ISTORE 372.2 0002CA .... DW link 372.3 0002CC FF DB 0FFh ; not immediate 372.4 0002CD link SET $ 372.5 0002CD 02 DB 2 372.6 0002CE 4921 DB 'I!' 372.7 0002D0 EVEN 372.8 0002D0 IF 'DOCODE'='DOCODE' 372.9 0002D0 .... ISTORE: DW $+2 372.10 0002D2 ELSE 372.11 0002D2 ISTORE: DW DOCODE 372.12 0002D2 ENDIF 372.13 0002D2 ENDM - 4e-core430G2553 - Page 46 373 0002D2 3644 MOV @PSP+,W ; get data to write 374 0002D4 17B3 BIT #1,TOS 375 0002D6 1F20 JNZ IST_X ; if not even address, do not write 376 0002D8 2697 CMP @TOS,W 377 0002DA 1D24 JZ IST_X ; if memory is desired value, do not write 378 0002DC ; is it within Main flash? 379 0002DC 379000C0 CMP #USERFLASHSTART,TOS 380 0002E0 0328 JNC IST_INFO ; if borrow, adrend, check if Info 383 0002E8 IST_INFO: ; is it within Info flash? 384 0002E8 37900010 CMP #INFOSTART,TOS 385 0002EC 0B28 JNC IST_RAM ; if borrow, adrend, assume it's RAM 388 0002F4 IST_OK: ; Address is either in Main flash, or in Info flash. 389 0002F4 ; Byte/word write from flash. 390 0002F4 ; Assumes location to write is already erased 391 0002F4 ; Assumes ACCVIE = NMIIE = OFIE = 0, watchdog disabled. 392 0002F4 ; Per section 5.3.3 of MSP430 Family User's Guide 393 0002F4 0212 PUSH sr 394 0002F6 32C2 DINT ; Disable interrupts 395 0002F8 B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear LOCK 396 0002FE B24040A52801 MOV #FWKEY+WRT,&FCTL1 ; Enable write 397 000304 IST_RAM: ; If RAM, jump here to write. FCTL1,FCTL3,EINT are superfluous 398 000304 87460000 MOV W,0(TOS) ; Write word to flash location 399 000308 B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear WRT. 400 00030E B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Set LOCK 401 000314 ; EINT ; Enable interrupts 402 000314 3241 POP sr 403 000316 3744 IST_X: MOV @PSP+,TOS ; pop new TOS 404 000318 NEXT 404.1 000318 3645 MOV @IP+,W // ; fetch word address into W 404.2 00031A 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 404.3 00031C ENDM 405 00031C 406 00031C ;Z IC! x a-addr -- store char in Instruction memory 407 00031C HEADER ICSTORE,3,'IC!',DOCODE 407.1 000000 PUBLIC ICSTORE 407.2 00031C .... DW link 407.3 00031E FF DB 0FFh ; not immediate 407.4 00031F link SET $ 407.5 00031F 03 DB 3 407.6 000320 494321 DB 'IC!' 407.7 000323 00 EVEN 407.8 000324 IF 'DOCODE'='DOCODE' - 4e-core430G2553 - Page 47 407.9 000324 .... ICSTORE: DW $+2 407.10 000326 ELSE 407.11 000326 ICSTORE: DW DOCODE 407.12 000326 ENDIF 407.13 000326 ENDM 408 000326 3644 MOV @PSP+,W ; get data to write 409 000328 6697 CMP.B @TOS,W 410 00032A F527 JZ IST_X ; if memory is desired value, do not write 411 00032C ; is it within Main flash? 412 00032C 379000C0 CMP #USERFLASHSTART,TOS 413 000330 0328 JNC ICST_INFO ; if borrow, adrend, check if Info 416 000338 ICST_INFO: ; is it within Info flash? 417 000338 37900010 CMP #INFOSTART,TOS 418 00033C 0B28 JNC ICST_RAM ; if borrow, adrend, assume it's RAM 421 000344 ICST_OK: ; Address is either in Main flash, or in Info flash. 422 000344 ; Byte/word write from flash. 423 000344 ; Assumes location to write is already erased 424 000344 ; Assumes ACCVIE = NMIIE = OFIE = 0, watchdog disabled. 425 000344 ; Per section 5.3.3 of MSP430 Family User's Guide 426 000344 0212 PUSH sr 427 000346 32C2 DINT ; Disable interrupts 428 000348 B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear LOCK 429 00034E B24040A52801 MOV #FWKEY+WRT,&FCTL1 ; Enable write 430 000354 ICST_RAM: ; If RAM, jump here to write. FCTL1,FCTL3,EINT are superfluous 431 000354 C7460000 MOV.B W,0(TOS) ; Write byte to flash location 432 000358 B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear WRT. 433 00035E B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Set LOCK 434 000364 ; EINT ; Enable interrupts 435 000364 3241 POP sr 436 000366 D73F JMP IST_X 437 000368 438 000368 /* 439 000368 ;Z I@ a-addr -- x fetch cell from Instruction memory 440 000368 HEADER IFETCH,2,'I@',FETCH+2 441 000368 442 000368 ;Z IC@ a-addr -- x fetch char from Instruction memory 443 000368 HEADER ICFETCH,3,'IC@',CFETCH+2 444 000368 */ 445 000368 #define IFETCH FETCH 446 000368 #define ICFETCH CFETCH 447 000368 448 000368 449 000368 450 000368 ;Z D->I c-addr1 c-addr2 u -- move Data->Code 451 000368 ; Block move from Data space to Code space. - 4e-core430G2553 - Page 48 Flashable. 452 000368 ; For the MSP430, this uses a "smart" algorithm that uses word writes, 453 000368 ; rather than byte writes, whenever possible. Note that byte reads 454 000368 ; are used for the source, so it need not be aligned. 455 000368 HEADER DTOI,4,'D->I',DOCODE 455.1 000000 PUBLIC DTOI 455.2 000368 .... DW link 455.3 00036A FF DB 0FFh ; not immediate 455.4 00036B link SET $ 455.5 00036B 04 DB 4 455.6 00036C 442D3E49 DB 'D->I' 455.7 000370 EVEN 455.8 000370 IF 'DOCODE'='DOCODE' 455.9 000370 .... DTOI: DW $+2 455.10 000372 ELSE 455.11 000372 DTOI: DW DOCODE 455.12 000372 ENDIF 455.13 000372 ENDM 456 000372 3644 MOV @PSP+,W ; dest adrs 457 000374 3A44 MOV @PSP+,X ; src adrs 458 000376 0793 CMP #0,TOS 459 000378 2124 JZ DTOI_X 460 00037A DTOI_LOOP: ; Begin flash write sequence 461 00037A 0212 PUSH sr 462 00037C 32C2 DINT ; Disable interrupts 463 00037E B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear LOCK 464 000384 B24040A52801 MOV #FWKEY+WRT,&FCTL1 ; Enable write 465 00038A ; If length is 1, or dest. address is odd, do a byte write. 466 00038A ; Else, do a word write. 467 00038A 1793 CMP #1,TOS 468 00038C 0B24 JZ DTOI_BYTE 469 00038E 16B3 BIT #1,W 470 000390 0920 JNZ DTOI_BYTE 471 000392 7B4A DTOI_WORD: MOV.B @X+,Y ; get low byte of word 472 000394 7C4A MOV.B @X+,Q ; get high byte of word 473 000396 8C10 SWPB Q 474 000398 0BDC BIS Q,Y ; merge bytes 475 00039A 864B0000 MOV.W Y,0(W) ; write byte to dest 476 00039E 2653 ADD #2,W 477 0003A0 1783 SUB #1,TOS ; another 1 will be subtracted below 478 0003A2 033C JMP DTOI_END 479 0003A4 F64A0000 DTOI_BYTE: MOV.B @X+,0(W) ; copy byte from src to dest 480 0003A8 1653 ADD #1,W 481 0003AA DTOI_END: ; End flash write sequence 482 0003AA B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear WRT. 483 0003B0 B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Set LOCK 484 0003B6 ; EINT ; Enable interrupts 485 0003B6 3241 POP sr 486 0003B8 1783 SUB #1,TOS 487 0003BA DF23 JNZ DTOI_LOOP 488 0003BC 3744 DTOI_X: MOV @PSP+,TOS ; pop new TOS 489 0003BE NEXT 489.1 0003BE 3645 MOV @IP+,W // ; fetch word address into W 489.2 0003C0 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 489.3 0003C2 ENDM 490 0003C2 491 0003C2 ; ---------------------------------------------- ------------------------ - 4e-core430G2553 - Page 49 492 0003C2 ; ARITHMETIC OPERATIONS 493 0003C2 494 0003C2 ;C + n1/u1 n2/u2 -- n3/u3 add n1+n2 495 0003C2 HEADER PLUS,1,'+',DOCODE 495.1 000000 PUBLIC PLUS 495.2 0003C2 .... DW link 495.3 0003C4 FF DB 0FFh ; not immediate 495.4 0003C5 link SET $ 495.5 0003C5 01 DB 1 495.6 0003C6 2B DB '+' 495.7 0003C7 00 EVEN 495.8 0003C8 IF 'DOCODE'='DOCODE' 495.9 0003C8 .... PLUS: DW $+2 495.10 0003CA ELSE 495.11 0003CA PLUS: DW DOCODE 495.12 0003CA ENDIF 495.13 0003CA ENDM 496 0003CA 3754 ADD @PSP+,TOS 497 0003CC NEXT 497.1 0003CC 3645 MOV @IP+,W // ; fetch word address into W 497.2 0003CE 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 497.3 0003D0 ENDM 498 0003D0 499 0003D0 ;C +! n/u a-addr -- add cell to memory 500 0003D0 HEADER PLUSSTORE,2,'+!',DOCODE 500.1 000000 PUBLIC PLUSSTORE 500.2 0003D0 .... DW link 500.3 0003D2 FF DB 0FFh ; not immediate 500.4 0003D3 link SET $ 500.5 0003D3 02 DB 2 500.6 0003D4 2B21 DB '+!' 500.7 0003D6 EVEN 500.8 0003D6 IF 'DOCODE'='DOCODE' 500.9 0003D6 .... PLUSSTORE: DW $+2 500.10 0003D8 ELSE 500.11 0003D8 PLUSSTORE: DW DOCODE 500.12 0003D8 ENDIF 500.13 0003D8 ENDM 501 0003D8 B7540000 ADD @PSP+,0(TOS) 502 0003DC 3744 MOV @PSP+,TOS 503 0003DE NEXT 503.1 0003DE 3645 MOV @IP+,W // ; fetch word address into W 503.2 0003E0 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 503.3 0003E2 ENDM 504 0003E2 505 0003E2 ;X M+ d n -- d add single to double 506 0003E2 HEADER MPLUS,2,'M+',DOCODE 506.1 000000 PUBLIC MPLUS 506.2 0003E2 .... DW link 506.3 0003E4 FF DB 0FFh ; not immediate 506.4 0003E5 link SET $ 506.5 0003E5 02 DB 2 506.6 0003E6 4D2B DB 'M+' 506.7 0003E8 EVEN 506.8 0003E8 IF 'DOCODE'='DOCODE' 506.9 0003E8 .... MPLUS: DW $+2 506.10 0003EA ELSE 506.11 0003EA MPLUS: DW DOCODE 506.12 0003EA ENDIF 506.13 0003EA ENDM 507 0003EA 84570200 ADD TOS,2(PSP) 508 0003EE 84630000 ADDC #0,0(PSP) 509 0003F2 3744 MOV @PSP+,TOS 510 0003F4 NEXT 510.1 0003F4 3645 MOV @IP+,W // ; fetch word address into W 510.2 0003F6 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 510.3 0003F8 ENDM 511 0003F8 512 0003F8 ;C - n1/u1 n2/u2 -- n3/u3 subtract - 4e-core430G2553 - Page 50 n1-n2 513 0003F8 HEADER MINUS,1,'-',DOCODE 513.1 000000 PUBLIC MINUS 513.2 0003F8 .... DW link 513.3 0003FA FF DB 0FFh ; not immediate 513.4 0003FB link SET $ 513.5 0003FB 01 DB 1 513.6 0003FC 2D DB '-' 513.7 0003FD 00 EVEN 513.8 0003FE IF 'DOCODE'='DOCODE' 513.9 0003FE .... MINUS: DW $+2 513.10 000400 ELSE 513.11 000400 MINUS: DW DOCODE 513.12 000400 ENDIF 513.13 000400 ENDM 514 000400 3644 MOV @PSP+,W 515 000402 0687 SUB TOS,W 516 000404 0746 MOV W,TOS 517 000406 NEXT 517.1 000406 3645 MOV @IP+,W // ; fetch word address into W 517.2 000408 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 517.3 00040A ENDM 518 00040A 519 00040A ;C AND x1 x2 -- x3 logical AND 520 00040A HEADER ANDD,3,'AND',DOCODE 520.1 000000 PUBLIC ANDD 520.2 00040A .... DW link 520.3 00040C FF DB 0FFh ; not immediate 520.4 00040D link SET $ 520.5 00040D 03 DB 3 520.6 00040E 414E44 DB 'AND' 520.7 000411 00 EVEN 520.8 000412 IF 'DOCODE'='DOCODE' 520.9 000412 .... ANDD: DW $+2 520.10 000414 ELSE 520.11 000414 ANDD: DW DOCODE 520.12 000414 ENDIF 520.13 000414 ENDM 521 000414 37F4 AND @PSP+,TOS 522 000416 NEXT 522.1 000416 3645 MOV @IP+,W // ; fetch word address into W 522.2 000418 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 522.3 00041A ENDM 523 00041A 524 00041A ;C OR x1 x2 -- x3 logical OR 525 00041A HEADER ORR,2,'OR',DOCODE 525.1 000000 PUBLIC ORR 525.2 00041A .... DW link 525.3 00041C FF DB 0FFh ; not immediate 525.4 00041D link SET $ 525.5 00041D 02 DB 2 525.6 00041E 4F52 DB 'OR' 525.7 000420 EVEN 525.8 000420 IF 'DOCODE'='DOCODE' 525.9 000420 .... ORR: DW $+2 525.10 000422 ELSE 525.11 000422 ORR: DW DOCODE 525.12 000422 ENDIF 525.13 000422 ENDM 526 000422 37D4 BIS @PSP+,TOS 527 000424 NEXT 527.1 000424 3645 MOV @IP+,W // ; fetch word address into W 527.2 000426 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 527.3 000428 ENDM 528 000428 529 000428 ;C XOR x1 x2 -- x3 logical XOR 530 000428 HEADER XORR,3,'XOR',DOCODE 530.1 000000 PUBLIC XORR 530.2 000428 .... DW link - 4e-core430G2553 - Page 51 530.3 00042A FF DB 0FFh ; not immediate 530.4 00042B link SET $ 530.5 00042B 03 DB 3 530.6 00042C 584F52 DB 'XOR' 530.7 00042F 00 EVEN 530.8 000430 IF 'DOCODE'='DOCODE' 530.9 000430 .... XORR: DW $+2 530.10 000432 ELSE 530.11 000432 XORR: DW DOCODE 530.12 000432 ENDIF 530.13 000432 ENDM 531 000432 37E4 XOR @PSP+,TOS 532 000434 NEXT 532.1 000434 3645 MOV @IP+,W // ; fetch word address into W 532.2 000436 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 532.3 000438 ENDM 533 000438 534 000438 ;C INVERT x1 -- x2 bitwise inversion 535 000438 HEADER INVERT,6,'INVERT',DOCODE 535.1 000000 PUBLIC INVERT 535.2 000438 .... DW link 535.3 00043A FF DB 0FFh ; not immediate 535.4 00043B link SET $ 535.5 00043B 06 DB 6 535.6 00043C 494E56455254 DB 'INVERT' 535.7 000442 EVEN 535.8 000442 IF 'DOCODE'='DOCODE' 535.9 000442 .... INVERT: DW $+2 535.10 000444 ELSE 535.11 000444 INVERT: DW DOCODE 535.12 000444 ENDIF 535.13 000444 ENDM 536 000444 37E3 XOR #-1,TOS 537 000446 NEXT 537.1 000446 3645 MOV @IP+,W // ; fetch word address into W 537.2 000448 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 537.3 00044A ENDM 538 00044A 539 00044A ;C NEGATE x1 -- x2 two's complement 540 00044A HEADER NEGATE,6,'NEGATE',DOCODE 540.1 000000 PUBLIC NEGATE 540.2 00044A .... DW link 540.3 00044C FF DB 0FFh ; not immediate 540.4 00044D link SET $ 540.5 00044D 06 DB 6 540.6 00044E 4E4547415445 DB 'NEGATE' 540.7 000454 EVEN 540.8 000454 IF 'DOCODE'='DOCODE' 540.9 000454 .... NEGATE: DW $+2 540.10 000456 ELSE 540.11 000456 NEGATE: DW DOCODE 540.12 000456 ENDIF 540.13 000456 ENDM 541 000456 37E3 XOR #-1,TOS 542 000458 1753 ADD #1,TOS 543 00045A NEXT 543.1 00045A 3645 MOV @IP+,W // ; fetch word address into W 543.2 00045C 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 543.3 00045E ENDM 544 00045E 545 00045E ;C 1+ n1/u1 -- n2/u2 add 1 to TOS 546 00045E HEADER ONEPLUS,2,'1+',DOCODE 546.1 000000 PUBLIC ONEPLUS 546.2 00045E .... DW link 546.3 000460 FF DB 0FFh ; not immediate 546.4 000461 link SET $ 546.5 000461 02 DB 2 546.6 000462 312B DB '1+' 546.7 000464 EVEN 546.8 000464 IF 'DOCODE'='DOCODE' - 4e-core430G2553 - Page 52 546.9 000464 .... ONEPLUS: DW $+2 546.10 000466 ELSE 546.11 000466 ONEPLUS: DW DOCODE 546.12 000466 ENDIF 546.13 000466 ENDM 547 000466 1753 ADD #1,TOS 548 000468 NEXT 548.1 000468 3645 MOV @IP+,W // ; fetch word address into W 548.2 00046A 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 548.3 00046C ENDM 549 00046C 550 00046C ;C 1- n1/u1 -- n2/u2 subtract 1 from TOS 551 00046C HEADER ONEMINUS,2,'1-',DOCODE 551.1 000000 PUBLIC ONEMINUS 551.2 00046C .... DW link 551.3 00046E FF DB 0FFh ; not immediate 551.4 00046F link SET $ 551.5 00046F 02 DB 2 551.6 000470 312D DB '1-' 551.7 000472 EVEN 551.8 000472 IF 'DOCODE'='DOCODE' 551.9 000472 .... ONEMINUS: DW $+2 551.10 000474 ELSE 551.11 000474 ONEMINUS: DW DOCODE 551.12 000474 ENDIF 551.13 000474 ENDM 552 000474 1783 SUB #1,TOS 553 000476 NEXT 553.1 000476 3645 MOV @IP+,W // ; fetch word address into W 553.2 000478 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 553.3 00047A ENDM 554 00047A 555 00047A ;Z >< x1 -- x2 swap bytes (not ANSI) 556 00047A HEADER SWAPBYTES,2,'><',DOCODE 556.1 000000 PUBLIC SWAPBYTES 556.2 00047A .... DW link 556.3 00047C FF DB 0FFh ; not immediate 556.4 00047D link SET $ 556.5 00047D 02 DB 2 556.6 00047E 3E3C DB '><' 556.7 000480 EVEN 556.8 000480 IF 'DOCODE'='DOCODE' 556.9 000480 .... SWAPBYTES: DW $+2 556.10 000482 ELSE 556.11 000482 SWAPBYTES: DW DOCODE 556.12 000482 ENDIF 556.13 000482 ENDM 557 000482 8710 SWPB TOS 558 000484 NEXT 558.1 000484 3645 MOV @IP+,W // ; fetch word address into W 558.2 000486 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 558.3 000488 ENDM 559 000488 560 000488 ;C 2* x1 -- x2 arithmetic left shift 561 000488 HEADER TWOSTAR,2,'2*',DOCODE 561.1 000000 PUBLIC TWOSTAR 561.2 000488 .... DW link 561.3 00048A FF DB 0FFh ; not immediate 561.4 00048B link SET $ 561.5 00048B 02 DB 2 561.6 00048C 322A DB '2*' 561.7 00048E EVEN 561.8 00048E IF 'DOCODE'='DOCODE' 561.9 00048E .... TWOSTAR: DW $+2 561.10 000490 ELSE 561.11 000490 TWOSTAR: DW DOCODE 561.12 000490 ENDIF 561.13 000490 ENDM 562 000490 0757 ADD TOS,TOS - 4e-core430G2553 - Page 53 563 000492 NEXT 563.1 000492 3645 MOV @IP+,W // ; fetch word address into W 563.2 000494 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 563.3 000496 ENDM 564 000496 565 000496 ;C 2/ x1 -- x2 arithmetic right shift 566 000496 HEADER TWOSLASH,2,'2/',DOCODE 566.1 000000 PUBLIC TWOSLASH 566.2 000496 .... DW link 566.3 000498 FF DB 0FFh ; not immediate 566.4 000499 link SET $ 566.5 000499 02 DB 2 566.6 00049A 322F DB '2/' 566.7 00049C EVEN 566.8 00049C IF 'DOCODE'='DOCODE' 566.9 00049C .... TWOSLASH: DW $+2 566.10 00049E ELSE 566.11 00049E TWOSLASH: DW DOCODE 566.12 00049E ENDIF 566.13 00049E ENDM 567 00049E 0711 RRA TOS 568 0004A0 NEXT 568.1 0004A0 3645 MOV @IP+,W // ; fetch word address into W 568.2 0004A2 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 568.3 0004A4 ENDM 569 0004A4 570 0004A4 ;C LSHIFT x1 u -- x2 logical L shift u places 571 0004A4 HEADER LSHIFT,6,'LSHIFT',DOCODE 571.1 000000 PUBLIC LSHIFT 571.2 0004A4 .... DW link 571.3 0004A6 FF DB 0FFh ; not immediate 571.4 0004A7 link SET $ 571.5 0004A7 06 DB 6 571.6 0004A8 4C5348494654 DB 'LSHIFT' 571.7 0004AE EVEN 571.8 0004AE IF 'DOCODE'='DOCODE' 571.9 0004AE .... LSHIFT: DW $+2 571.10 0004B0 ELSE 571.11 0004B0 LSHIFT: DW DOCODE 571.12 0004B0 ENDIF 571.13 0004B0 ENDM 572 0004B0 3644 MOV @PSP+,W 573 0004B2 37F01F00 AND #1Fh,TOS ; no need to shift more than 16 574 0004B6 0324 JZ LSH_X 575 0004B8 0656 LSH_1: ADD W,W 576 0004BA 1783 SUB #1,TOS 577 0004BC FD23 JNZ LSH_1 578 0004BE 0746 LSH_X: MOV W,TOS 579 0004C0 NEXT 579.1 0004C0 3645 MOV @IP+,W // ; fetch word address into W 579.2 0004C2 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 579.3 0004C4 ENDM 580 0004C4 581 0004C4 ;C RSHIFT x1 u -- x2 logical R shift u places 582 0004C4 HEADER RSHIFT,6,'RSHIFT',DOCODE 582.1 000000 PUBLIC RSHIFT 582.2 0004C4 .... DW link 582.3 0004C6 FF DB 0FFh ; not immediate 582.4 0004C7 link SET $ 582.5 0004C7 06 DB 6 582.6 0004C8 525348494654 DB 'RSHIFT' 582.7 0004CE EVEN 582.8 0004CE IF 'DOCODE'='DOCODE' 582.9 0004CE .... RSHIFT: DW $+2 582.10 0004D0 ELSE 582.11 0004D0 RSHIFT: DW DOCODE 582.12 0004D0 ENDIF - 4e-core430G2553 - Page 54 582.13 0004D0 ENDM 583 0004D0 3644 MOV @PSP+,W 584 0004D2 37F01F00 AND #1Fh,TOS ; no need to shift more than 16 585 0004D6 0424 JZ RSH_X 586 0004D8 12C3 RSH_1: CLRC 587 0004DA 0610 RRC W 588 0004DC 1783 SUB #1,TOS 589 0004DE FC23 JNZ RSH_1 590 0004E0 0746 RSH_X: MOV W,TOS 591 0004E2 NEXT 591.1 0004E2 3645 MOV @IP+,W // ; fetch word address into W 591.2 0004E4 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 591.3 0004E6 ENDM 592 0004E6 593 0004E6 ; ---------------------------------------------- ------------------------ 594 0004E6 ; COMPARISON OPERATIONS 595 0004E6 596 0004E6 ;C 0= n/u -- flag return true if TOS=0 597 0004E6 HEADER ZEROEQUAL,2,'0=',DOCODE 597.1 000000 PUBLIC ZEROEQUAL 597.2 0004E6 .... DW link 597.3 0004E8 FF DB 0FFh ; not immediate 597.4 0004E9 link SET $ 597.5 0004E9 02 DB 2 597.6 0004EA 303D DB '0=' 597.7 0004EC EVEN 597.8 0004EC IF 'DOCODE'='DOCODE' 597.9 0004EC .... ZEROEQUAL: DW $+2 597.10 0004EE ELSE 597.11 0004EE ZEROEQUAL: DW DOCODE 597.12 0004EE ENDIF 597.13 0004EE ENDM 598 0004EE 1783 SUB #1,TOS ; borrow (clear cy) if TOS was 0 599 0004F0 0777 SUBC TOS,TOS ; TOS=-1 if borrow was set 600 0004F2 NEXT 600.1 0004F2 3645 MOV @IP+,W // ; fetch word address into W 600.2 0004F4 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 600.3 0004F6 ENDM 601 0004F6 602 0004F6 ;C 0< n -- flag true if TOS negative 603 0004F6 HEADER ZEROLESS,2,'0<',DOCODE 603.1 000000 PUBLIC ZEROLESS 603.2 0004F6 .... DW link 603.3 0004F8 FF DB 0FFh ; not immediate 603.4 0004F9 link SET $ 603.5 0004F9 02 DB 2 603.6 0004FA 303C DB '0<' 603.7 0004FC EVEN 603.8 0004FC IF 'DOCODE'='DOCODE' 603.9 0004FC .... ZEROLESS: DW $+2 603.10 0004FE ELSE 603.11 0004FE ZEROLESS: DW DOCODE 603.12 0004FE ENDIF 603.13 0004FE ENDM 604 0004FE 0757 ADD TOS,TOS ; set cy if TOS negative 605 000500 0777 SUBC TOS,TOS ; TOS=-1 if carry was clear 606 000502 37E3 XOR #-1,TOS ; TOS=-1 if carry was set 607 000504 NEXT 607.1 000504 3645 MOV @IP+,W // ; fetch word address into W 607.2 000506 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 607.3 000508 ENDM 608 000508 - 4e-core430G2553 - Page 55 609 000508 ;C = x1 x2 -- flag test x1=x2 610 000508 HEADER EQUAL,1,'=',DOCODE 610.1 000000 PUBLIC EQUAL 610.2 000508 .... DW link 610.3 00050A FF DB 0FFh ; not immediate 610.4 00050B link SET $ 610.5 00050B 01 DB 1 610.6 00050C 3D DB '=' 610.7 00050D 00 EVEN 610.8 00050E IF 'DOCODE'='DOCODE' 610.9 00050E .... EQUAL: DW $+2 610.10 000510 ELSE 610.11 000510 EQUAL: DW DOCODE 610.12 000510 ENDIF 610.13 000510 ENDM 611 000510 3644 MOV @PSP+,W 612 000512 0687 SUB TOS,W ; x1-x2 in W, flags set 613 000514 1124 JZ TOSTRUE 614 000516 0743 TOSFALSE: MOV #0,TOS 615 000518 NEXT 615.1 000518 3645 MOV @IP+,W // ; fetch word address into W 615.2 00051A 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 615.3 00051C ENDM 616 00051C 617 00051C ;X <> x1 x2 -- flag test not eq (not ANSI) 618 00051C HEADER NOTEQUAL,2,'<>',DOCOLON 618.1 000000 PUBLIC NOTEQUAL 618.2 00051C .... DW link 618.3 00051E FF DB 0FFh ; not immediate 618.4 00051F link SET $ 618.5 00051F 02 DB 2 618.6 000520 3C3E DB '<>' 618.7 000522 EVEN 618.8 000522 IF 'DOCOLON'='DOCODE' 618.9 000522 NOTEQUAL: DW $+2 618.10 000522 ELSE 618.11 000522 .... NOTEQUAL: DW DOCOLON 618.12 000524 ENDIF 618.13 000524 ENDM 619 000524 ............ DW EQUAL,ZEROEQUAL,EXIT 620 00052A 621 00052A ;C < n1 n2 -- flag test n1 n1 n2 -- flag test n1>n2, signed 630 00053E HEADER GREATER,1,'>',DOCOLON 630.1 000000 PUBLIC GREATER 630.2 00053E .... DW link - 4e-core430G2553 - Page 56 630.3 000540 FF DB 0FFh ; not immediate 630.4 000541 link SET $ 630.5 000541 01 DB 1 630.6 000542 3E DB '>' 630.7 000543 00 EVEN 630.8 000544 IF 'DOCOLON'='DOCODE' 630.9 000544 GREATER: DW $+2 630.10 000544 ELSE 630.11 000544 .... GREATER: DW DOCOLON 630.12 000546 ENDIF 630.13 000546 ENDM 631 000546 ............ DW SWAP,LESS,EXIT 632 00054C 633 00054C ;C U< u1 u2 -- flag test u1 u1 u2 -- flag u1>u2 unsgd (not ANSI) 641 00055C HEADER UGREATER,2,'U>',DOCOLON 641.1 000000 PUBLIC UGREATER 641.2 00055C .... DW link 641.3 00055E FF DB 0FFh ; not immediate 641.4 00055F link SET $ 641.5 00055F 02 DB 2 641.6 000560 553E DB 'U>' 641.7 000562 EVEN 641.8 000562 IF 'DOCOLON'='DOCODE' 641.9 000562 UGREATER: DW $+2 641.10 000562 ELSE 641.11 000562 .... UGREATER: DW DOCOLON 641.12 000564 ENDIF 641.13 000564 ENDM 642 000564 ............ DW SWAP,ULESS,EXIT 643 00056A 644 00056A ;C RLA n1 -- n2 f rotate left through carry, true if carry set 645 00056A HEADER RLAA,3,'RLA',DOCODE 645.1 000000 PUBLIC RLAA 645.2 00056A .... DW link 645.3 00056C FF DB 0FFh ; not immediate 645.4 00056D link SET $ 645.5 00056D 03 DB 3 645.6 00056E 524C41 DB 'RLA' 645.7 000571 00 EVEN 645.8 000572 IF 'DOCODE'='DOCODE' 645.9 000572 .... RLAA: DW $+2 645.10 000574 ELSE 645.11 000574 RLAA: DW DOCODE 645.12 000574 ENDIF 645.13 000574 ENDM 646 000574 0757 RLA TOS ; shift left 647 000576 0212 PUSH SR 648 000578 2483 SUB #2,PSP ; 1 push old TOS.. 649 00057A 84470000 MOV TOS,0(PSP) ; 4 ..onto stack 650 00057E 3241 POP SR 651 000580 DB2F JC TOSTRUE 652 000582 C93F JMP TOSFALSE 653 000584 - 4e-core430G2553 - Page 57 654 000584 655 000584 656 000584 ; ---------------------------------------------- ------------------------ 657 000584 ; LOOP AND BRANCH OPERATIONS 658 000584 ; These use relative branch addresses: a branch is ADD @IP,IP 659 000584 660 000584 ;Z branch -- branch always 661 000584 HEADER bran,6,'branch',DOCODE 661.1 000000 PUBLIC bran 661.2 000584 .... DW link 661.3 000586 FF DB 0FFh ; not immediate 661.4 000587 link SET $ 661.5 000587 06 DB 6 661.6 000588 6272616E6368 DB 'branch' 661.7 00058E EVEN 661.8 00058E IF 'DOCODE'='DOCODE' 661.9 00058E .... bran: DW $+2 661.10 000590 ELSE 661.11 000590 bran: DW DOCODE 661.12 000590 ENDIF 661.13 000590 ENDM 662 000590 2555 dobran: ADD @IP,IP ; 2 663 000592 NEXT ; 4 663.1 000592 3645 MOV @IP+,W // ; fetch word address into W 663.2 000594 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 663.3 000596 ENDM 664 000596 665 000596 ;Z ?branch x -- branch if TOS zero 666 000596 HEADER qbran,7,'?branch',DOCODE 666.1 000000 PUBLIC qbran 666.2 000596 .... DW link 666.3 000598 FF DB 0FFh ; not immediate 666.4 000599 link SET $ 666.5 000599 07 DB 7 666.6 00059A 3F6272616E63* DB '?branch' 666.7 0005A1 00 EVEN 666.8 0005A2 IF 'DOCODE'='DOCODE' 666.9 0005A2 .... qbran: DW $+2 666.10 0005A4 ELSE 666.11 0005A4 qbran: DW DOCODE 666.12 0005A4 ENDIF 666.13 0005A4 ENDM 667 0005A4 0753 ADD #0,TOS ; 1 test TOS value 668 0005A6 3744 MOV @PSP+,TOS ; 2 pop new TOS value (doesn't change flags) 669 0005A8 F327 JZ dobran ; 2 if TOS was zero, take the branch 670 0005AA 2553 ADD #2,IP ; 1 else skip the branch destination 671 0005AC NEXT ; 4 671.1 0005AC 3645 MOV @IP+,W // ; fetch word address into W 671.2 0005AE 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 671.3 0005B0 ENDM 672 0005B0 673 0005B0 ;Z (do) n1|u1 n2|u2 -- R: -- sys1 sys2 run-time code for DO 674 0005B0 ; '83 and ANSI standard loops terminate when the boundary of 675 0005B0 ; limit-1 and limit is crossed, in either direction. This can 676 0005B0 ; be conveniently implemented by making the limit 8000h, so that 677 0005B0 ; arithmetic overflow logic can detect crossing. I learned this 678 0005B0 ; trick from Laxen & Perry F83. 679 0005B0 ; fudge factor = 8000h-limit, to be added to the start value. 680 0005B0 HEADER xdo,4,'(do)',DOCODE 680.1 000000 PUBLIC xdo - 4e-core430G2553 - Page 58 680.2 0005B0 .... DW link 680.3 0005B2 FF DB 0FFh ; not immediate 680.4 0005B3 link SET $ 680.5 0005B3 04 DB 4 680.6 0005B4 28646F29 DB '(do)' 680.7 0005B8 EVEN 680.8 0005B8 IF 'DOCODE'='DOCODE' 680.9 0005B8 .... xdo: DW $+2 680.10 0005BA ELSE 680.11 0005BA xdo: DW DOCODE 680.12 0005BA ENDIF 680.13 0005BA ENDM 681 0005BA 2182 SUB #4,RSP ; push old loop values on return stack 682 0005BC 81490200 MOV LIMIT,2(RSP) 683 0005C0 81480000 MOV INDEX,0(RSP) 684 0005C4 39400080 MOV #8000h,LIMIT ; compute 8000h-limit "fudge factor" 685 0005C8 3984 SUB @PSP+,LIMIT 686 0005CA 0847 MOV TOS,INDEX ; loop ctr = index+fudge 687 0005CC 0859 ADD LIMIT,INDEX 688 0005CE 3744 MOV @PSP+,TOS ; pop new TOS 689 0005D0 NEXT 689.1 0005D0 3645 MOV @IP+,W // ; fetch word address into W 689.2 0005D2 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 689.3 0005D4 ENDM 690 0005D4 691 0005D4 ;Z (loop) R: sys1 sys2 -- | sys1 sys2 run-time code for LOOP 692 0005D4 ; Add 1 to the loop index. If loop terminates, clean up the 693 0005D4 ; return stack and skip the branch. Else take the inline branch. 694 0005D4 ; Note that LOOP terminates when index=8000h. 695 0005D4 HEADER xloop,6,'(loop)',DOCODE 695.1 000000 PUBLIC xloop 695.2 0005D4 .... DW link 695.3 0005D6 FF DB 0FFh ; not immediate 695.4 0005D7 link SET $ 695.5 0005D7 06 DB 6 695.6 0005D8 286C6F6F7029 DB '(loop)' 695.7 0005DE EVEN 695.8 0005DE IF 'DOCODE'='DOCODE' 695.9 0005DE .... xloop: DW $+2 695.10 0005E0 ELSE 695.11 0005E0 xloop: DW DOCODE 695.12 0005E0 ENDIF 695.13 0005E0 ENDM 696 0005E0 1853 ADD #1,INDEX 697 0005E2 32B00001 BIT #100h,SR ; is overflow bit set? 698 0005E6 D427 JZ dobran ; no overflow = loop 699 0005E8 2553 ADD #2,IP ; overflow = loop done, skip branch ofs 700 0005EA 3841 MOV @RSP+,INDEX ; restore old loop values 701 0005EC 3941 MOV @RSP+,LIMIT 702 0005EE NEXT 702.1 0005EE 3645 MOV @IP+,W // ; fetch word address into W 702.2 0005F0 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 702.3 0005F2 ENDM 703 0005F2 704 0005F2 ;Z (+loop) n -- R: sys1 sys2 -- | sys1 sys2 run-time code for +LOOP 705 0005F2 ; Add n to the loop index. If loop terminates, clean up the - 4e-core430G2553 - Page 59 706 0005F2 ; return stack and skip the branch. Else take the inline branch. 707 0005F2 HEADER xplusloop,7,'(+loop)',DOCODE 707.1 000000 PUBLIC xplusloop 707.2 0005F2 .... DW link 707.3 0005F4 FF DB 0FFh ; not immediate 707.4 0005F5 link SET $ 707.5 0005F5 07 DB 7 707.6 0005F6 282B6C6F6F70* DB '(+loop)' 707.7 0005FD 00 EVEN 707.8 0005FE IF 'DOCODE'='DOCODE' 707.9 0005FE .... xplusloop: DW $+2 707.10 000600 ELSE 707.11 000600 xplusloop: DW DOCODE 707.12 000600 ENDIF 707.13 000600 ENDM 708 000600 0857 ADD TOS,INDEX 709 000602 3744 MOV @PSP+,TOS ; get new TOS, doesn't change flags 710 000604 32B00001 BIT #100h,SR ; is overflow bit set? 711 000608 C327 JZ dobran ; no overflow = loop 712 00060A 2553 ADD #2,IP ; overflow = loop done, skip branch ofs 713 00060C 3841 MOV @RSP+,INDEX ; restore old loop values 714 00060E 3941 MOV @RSP+,LIMIT 715 000610 NEXT 715.1 000610 3645 MOV @IP+,W // ; fetch word address into W 715.2 000612 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 715.3 000614 ENDM 716 000614 717 000614 ;C I -- n R: sys1 sys2 -- sys1 sys2 get the innermost loop index 718 000614 HEADER II,1,'I',DOCODE 718.1 000000 PUBLIC II 718.2 000614 .... DW link 718.3 000616 FF DB 0FFh ; not immediate 718.4 000617 link SET $ 718.5 000617 01 DB 1 718.6 000618 49 DB 'I' 718.7 000619 00 EVEN 718.8 00061A IF 'DOCODE'='DOCODE' 718.9 00061A .... II: DW $+2 718.10 00061C ELSE 718.11 00061C II: DW DOCODE 718.12 00061C ENDIF 718.13 00061C ENDM 719 00061C 2483 SUB #2,PSP ; make room in TOS 720 00061E 84470000 MOV TOS,0(PSP) 721 000622 0748 MOV INDEX,TOS ; index = loopctr - fudge 722 000624 0789 SUB LIMIT,TOS 723 000626 NEXT 723.1 000626 3645 MOV @IP+,W // ; fetch word address into W 723.2 000628 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 723.3 00062A ENDM 724 00062A 725 00062A ;C J -- n R: 4*sys -- 4*sys get the second loop index 726 00062A HEADER JJ,1,'J',DOCODE 726.1 000000 PUBLIC JJ 726.2 00062A .... DW link 726.3 00062C FF DB 0FFh ; not immediate 726.4 00062D link SET $ 726.5 00062D 01 DB 1 726.6 00062E 4A DB 'J' 726.7 00062F 00 EVEN 726.8 000630 IF 'DOCODE'='DOCODE' - 4e-core430G2553 - Page 60 726.9 000630 .... JJ: DW $+2 726.10 000632 ELSE 726.11 000632 JJ: DW DOCODE 726.12 000632 ENDIF 726.13 000632 ENDM 727 000632 2483 SUB #2,PSP ; make room in TOS 728 000634 84470000 MOV TOS,0(PSP) 729 000638 2741 MOV @RSP,TOS ; index = loopctr - fudge 730 00063A 17810200 SUB 2(RSP),TOS 731 00063E NEXT 731.1 00063E 3645 MOV @IP+,W // ; fetch word address into W 731.2 000640 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 731.3 000642 ENDM 732 000642 733 000642 ;C UNLOOP -- R: sys1 sys2 -- drop loop parms 734 000642 HEADER UNLOOP,6,'UNLOOP',DOCODE 734.1 000000 PUBLIC UNLOOP 734.2 000642 .... DW link 734.3 000644 FF DB 0FFh ; not immediate 734.4 000645 link SET $ 734.5 000645 06 DB 6 734.6 000646 554E4C4F4F50 DB 'UNLOOP' 734.7 00064C EVEN 734.8 00064C IF 'DOCODE'='DOCODE' 734.9 00064C .... UNLOOP: DW $+2 734.10 00064E ELSE 734.11 00064E UNLOOP: DW DOCODE 734.12 00064E ENDIF 734.13 00064E ENDM 735 00064E 3841 MOV @RSP+,INDEX ; restore old loop values 736 000650 3941 MOV @RSP+,LIMIT 737 000652 NEXT 737.1 000652 3645 MOV @IP+,W // ; fetch word address into W 737.2 000654 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 737.3 000656 ENDM 738 000656 739 000656 ; ---------------------------------------------- ------------------------ 740 000656 ; MULTIPLY AND DIVIDE 741 000656 742 000656 ;C UM* u1 u2 -- ud unsigned 16x16->32 mult. 743 000656 HEADER UMSTAR,3,'UM*',DOCODE 743.1 000000 PUBLIC UMSTAR 743.2 000656 .... DW link 743.3 000658 FF DB 0FFh ; not immediate 743.4 000659 link SET $ 743.5 000659 03 DB 3 743.6 00065A 554D2A DB 'UM*' 743.7 00065D 00 EVEN 743.8 00065E IF 'DOCODE'='DOCODE' 743.9 00065E .... UMSTAR: DW $+2 743.10 000660 ELSE 743.11 000660 UMSTAR: DW DOCODE 743.12 000660 ENDIF 743.13 000660 ENDM 744 000660 ; IROP1 = TOS register 745 000660 2A44 MOV @PSP,IROP2L ; get u1, leave room on stack 746 000662 ; 747 000662 ; T.I. SIGNED MULTIPLY SUBROUTINE: IROP1 x IROP2L -> IRACM|IRACL 748 000662 0C43 MPYU: CLR IRACL ; 0 -> LSBs RESULT 749 000664 0D43 CLR IRACM ; 0 -> MSBs RESULT 750 000666 ; UNSIGNED MULTIPLY AND ACCUMULATE SUBROUTINE: 751 000666 ; (IROP1 x IROP2L) + IRACM|IRACL -> IRACM|IRACL 752 000666 0B43 MACU: CLR IROP2M ; MSBs MULTIPLIER 753 000668 1643 MOV #1,IRBT ; BIT TEST REGISTER - 4e-core430G2553 - Page 61 754 00066A 07B6 L$002: BIT IRBT,IROP1 ; TEST ACTUAL BIT 755 00066C 0224 JZ L$01 ; IF 0: DO NOTHING 756 00066E 0C5A ADD IROP2L,IRACL ; IF 1: ADD MULTIPLIER TO RESULT 757 000670 0D6B ADDC IROP2M,IRACM 758 000672 0A5A L$01: RLA IROP2L ; MULTIPLIER x 2 759 000674 0B6B RLC IROP2M 760 000676 ; 761 000676 0656 RLA IRBT ; NEXT BIT TO TEST 762 000678 F82B JNC L$002 ; IF BIT IN CARRY: FINISHED 763 00067A ; END T.I. ROUTINE section 5.1.1 of MSP430 Family Application Reports 764 00067A 844C0000 MOV IRACL,0(PSP) ; low result on stack 765 00067E 074D MOV IRACM,TOS ; high result in TOS 766 000680 NEXT 766.1 000680 3645 MOV @IP+,W // ; fetch word address into W 766.2 000682 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 766.3 000684 ENDM 767 000684 768 000684 ;C UM/MOD ud u1 -- u2 u3 unsigned 32/16->16 769 000684 HEADER UMSLASHMOD,6,'UM/MOD',DOCODE 769.1 000000 PUBLIC UMSLASHMOD 769.2 000684 .... DW link 769.3 000686 FF DB 0FFh ; not immediate 769.4 000687 link SET $ 769.5 000687 06 DB 6 769.6 000688 554D2F4D4F44 DB 'UM/MOD' 769.7 00068E EVEN 769.8 00068E IF 'DOCODE'='DOCODE' 769.9 00068E .... UMSLASHMOD: DW $+2 769.10 000690 ELSE 769.11 000690 UMSLASHMOD: DW DOCODE 769.12 000690 ENDIF 769.13 000690 ENDM 770 000690 ; IROP1 = TOS register 771 000690 3B44 MOV @PSP+,IROP2M ; get ud hi 772 000692 2A44 MOV @PSP,IROP2L ; get ud lo, leave room on stack 773 000694 ; 774 000694 ; T.I. UNSIGNED DIVISION SUBROUTINE 32-BIT BY 16-BIT 775 000694 ; IROP2M|IROP2L : IROP1 -> IRACL REMAINDER IN IROP2M 776 000694 ; RETURN: CARRY = 0: OK CARRY = 1: QUOTIENT > 16 BITS 777 000694 0C43 DIVIDE: CLR IRACL ; CLEAR RESULT 778 000696 36401100 MOV #17,IRBT ; INITIALIZE LOOP COUNTER 779 00069A 0B97 DIV1: CMP IROP1,IROP2M ; 780 00069C 0128 JLO DIV2 781 00069E 0B87 SUB IROP1,IROP2M 782 0006A0 0C6C DIV2: RLC IRACL 783 0006A2 092C JC DIV4 ; Error: result > 16 bits 784 0006A4 1683 DEC IRBT ; Decrement loop counter 785 0006A6 0624 JZ DIV3 ; Is 0: terminate w/o error 786 0006A8 0A5A RLA IROP2L 787 0006AA 0B6B RLC IROP2M 788 0006AC F62B JNC DIV1 789 0006AE 0B87 SUB IROP1,IROP2M 790 0006B0 12D3 SETC 791 0006B2 F63F JMP DIV2 792 0006B4 12C3 DIV3: CLRC ; No error, C = 0 793 0006B6 DIV4: ; Error indication in C 794 0006B6 ; END T.I. ROUTINE Section 5.1.5 of MSP430 Family Application Reports 795 0006B6 844B0000 MOV IROP2M,0(PSP) ; remainder on stack 796 0006BA 074C MOV IRACL,TOS ; quotient in TOS - 4e-core430G2553 - Page 62 797 0006BC NEXT 797.1 0006BC 3645 MOV @IP+,W // ; fetch word address into W 797.2 0006BE 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 797.3 0006C0 ENDM 798 0006C0 799 0006C0 ; ---------------------------------------------- ------------------------ 800 0006C0 ; BLOCK AND STRING OPERATIONS 801 0006C0 802 0006C0 ;C FILL c-addr u char -- fill memory with char 803 0006C0 HEADER FILL,4,'FILL',DOCODE 803.1 000000 PUBLIC FILL 803.2 0006C0 .... DW link 803.3 0006C2 FF DB 0FFh ; not immediate 803.4 0006C3 link SET $ 803.5 0006C3 04 DB 4 803.6 0006C4 46494C4C DB 'FILL' 803.7 0006C8 EVEN 803.8 0006C8 IF 'DOCODE'='DOCODE' 803.9 0006C8 .... FILL: DW $+2 803.10 0006CA ELSE 803.11 0006CA FILL: DW DOCODE 803.12 0006CA ENDIF 803.13 0006CA ENDM 804 0006CA 3A44 MOV @PSP+,X ; count 805 0006CC 3644 MOV @PSP+,W ; address 806 0006CE 0A93 CMP #0,X 807 0006D0 0524 JZ FILL_X 808 0006D2 C6470000 FILL_1: MOV.B TOS,0(W) ; store char in memory 809 0006D6 1653 ADD #1,W 810 0006D8 1A83 SUB #1,X 811 0006DA FB23 JNZ FILL_1 812 0006DC 3744 FILL_X: MOV @PSP+,TOS ; pop new TOS 813 0006DE NEXT 813.1 0006DE 3645 MOV @IP+,W // ; fetch word address into W 813.2 0006E0 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 813.3 0006E2 ENDM 814 0006E2 815 0006E2 ;X CMOVE c-addr1 c-addr2 u -- move from bottom 816 0006E2 ; as defined in the ANSI optional String word set 817 0006E2 ; On byte machines, CMOVE and CMOVE> are logical 818 0006E2 ; factors of MOVE. They are easy to implement on 819 0006E2 ; CPUs which have a block-move instruction. 820 0006E2 HEADER CMOVE,5,'CMOVE',DOCODE 820.1 000000 PUBLIC CMOVE 820.2 0006E2 .... DW link 820.3 0006E4 FF DB 0FFh ; not immediate 820.4 0006E5 link SET $ 820.5 0006E5 05 DB 5 820.6 0006E6 434D4F5645 DB 'CMOVE' 820.7 0006EB 00 EVEN 820.8 0006EC IF 'DOCODE'='DOCODE' 820.9 0006EC .... CMOVE: DW $+2 820.10 0006EE ELSE 820.11 0006EE CMOVE: DW DOCODE 820.12 0006EE ENDIF 820.13 0006EE ENDM 821 0006EE 3644 MOV @PSP+,W ; dest adrs 822 0006F0 3A44 MOV @PSP+,X ; src adrs 823 0006F2 0793 CMP #0,TOS 824 0006F4 0524 JZ CMOVE_X 825 0006F6 F64A0000 CMOVE_1: MOV.B @X+,0(W) ; copy byte 826 0006FA 1653 ADD #1,W 827 0006FC 1783 SUB #1,TOS 828 0006FE FB23 JNZ CMOVE_1 829 000700 3744 CMOVE_X: MOV @PSP+,TOS ; pop new TOS 830 000702 NEXT 830.1 000702 3645 MOV @IP+,W // ; fetch word address - 4e-core430G2553 - Page 63 into W 830.2 000704 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 830.3 000706 ENDM 831 000706 832 000706 ;X CMOVE> c-addr1 c-addr2 u -- move from top 833 000706 ; as defined in the ANSI optional String word set 834 000706 HEADER CMOVEUP,6,'CMOVE>',DOCODE 834.1 000000 PUBLIC CMOVEUP 834.2 000706 .... DW link 834.3 000708 FF DB 0FFh ; not immediate 834.4 000709 link SET $ 834.5 000709 06 DB 6 834.6 00070A 434D4F56453E DB 'CMOVE>' 834.7 000710 EVEN 834.8 000710 IF 'DOCODE'='DOCODE' 834.9 000710 .... CMOVEUP: DW $+2 834.10 000712 ELSE 834.11 000712 CMOVEUP: DW DOCODE 834.12 000712 ENDIF 834.13 000712 ENDM 835 000712 3644 MOV @PSP+,W ; dest adrs 836 000714 3A44 MOV @PSP+,X ; src adrs 837 000716 0793 CMP #0,TOS 838 000718 0824 JZ CMOVU_X 839 00071A 0657 ADD TOS,W ; start at end 840 00071C 0A57 ADD TOS,X 841 00071E 1A83 CMOVU_1: SUB #1,X 842 000720 1683 SUB #1,W 843 000722 E64A0000 MOV.B @X,0(W) ; copy byte 844 000726 1783 SUB #1,TOS 845 000728 FA23 JNZ CMOVU_1 846 00072A 3744 CMOVU_X: MOV @PSP+,TOS ; pop new TOS 847 00072C NEXT 847.1 00072C 3645 MOV @IP+,W // ; fetch word address into W 847.2 00072E 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 847.3 000730 ENDM 848 000730 849 000730 ;Z I->D c-addr1 c-addr2 u -- move Code->Data 850 000730 ; Block move from Code space to Data space. 851 000730 ; On the MSP430, this is the same as CMOVE. 852 000730 HEADER ITOD,4,'I->D',CMOVE+2 852.1 000000 PUBLIC ITOD 852.2 000730 .... DW link 852.3 000732 FF DB 0FFh ; not immediate 852.4 000733 link SET $ 852.5 000733 04 DB 4 852.6 000734 492D3E44 DB 'I->D' 852.7 000738 EVEN 852.8 000738 IF 'CMOVE+2'='DOCODE' 852.9 000738 ITOD: DW $+2 852.10 000738 ELSE 852.11 000738 .... ITOD: DW CMOVE+2 852.12 00073A ENDIF 852.13 00073A ENDM 853 00073A 854 00073A ;Z SKIP c-addr u c -- c-addr' u' skip matching chars 855 00073A ; Although SKIP, SCAN, and S= are perhaps not the ideal factors 856 00073A ; of WORD and FIND, they closely follow the string operations 857 00073A ; available on many CPUs, and so are easy to implement and fast. 858 00073A HEADER SKIP,4,'SKIP',DOCODE 858.1 000000 PUBLIC SKIP 858.2 00073A .... DW link 858.3 00073C FF DB 0FFh ; not immediate 858.4 00073D link SET $ 858.5 00073D 04 DB 4 858.6 00073E 534B4950 DB 'SKIP' 858.7 000742 EVEN - 4e-core430G2553 - Page 64 858.8 000742 IF 'DOCODE'='DOCODE' 858.9 000742 .... SKIP: DW $+2 858.10 000744 ELSE 858.11 000744 SKIP: DW DOCODE 858.12 000744 ENDIF 858.13 000744 ENDM 859 000744 3A44 MOV @PSP+,X ; get count 860 000746 2644 MOV @PSP,W ; get address, leave space on stack 861 000748 0A93 CMP #0,X 862 00074A 0524 JZ SKIP_X 863 00074C 6796 SKIP_1: CMP.B @W,TOS ; does character match? 864 00074E 0320 JNZ SKIP_X ; no, we are done 865 000750 1653 ADD #1,W 866 000752 1A83 SUB #1,X 867 000754 FB23 JNZ SKIP_1 868 000756 84460000 SKIP_X: MOV W,0(PSP) ; store updated address on stack 869 00075A 074A MOV X,TOS ; updated count to TOS 870 00075C NEXT 870.1 00075C 3645 MOV @IP+,W // ; fetch word address into W 870.2 00075E 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 870.3 000760 ENDM 871 000760 872 000760 ;Z SCAN c-addr u c -- c-addr' u' find matching char 873 000760 HEADER SCAN,4,'SCAN',DOCODE 873.1 000000 PUBLIC SCAN 873.2 000760 .... DW link 873.3 000762 FF DB 0FFh ; not immediate 873.4 000763 link SET $ 873.5 000763 04 DB 4 873.6 000764 5343414E DB 'SCAN' 873.7 000768 EVEN 873.8 000768 IF 'DOCODE'='DOCODE' 873.9 000768 .... SCAN: DW $+2 873.10 00076A ELSE 873.11 00076A SCAN: DW DOCODE 873.12 00076A ENDIF 873.13 00076A ENDM 874 00076A 3A44 MOV @PSP+,X ; get count 875 00076C 2644 MOV @PSP,W ; get address, leave space on stack 876 00076E 0A93 CMP #0,X 877 000770 0524 JZ SCAN_X 878 000772 6796 SCAN_1: CMP.B @W,TOS ; does character match? 879 000774 0324 JZ SCAN_X ; yes, we are done 880 000776 1653 ADD #1,W 881 000778 1A83 SUB #1,X 882 00077A FB23 JNZ SCAN_1 883 00077C 84460000 SCAN_X: MOV W,0(PSP) ; store updated address on stack 884 000780 074A MOV X,TOS ; updated count to TOS 885 000782 NEXT 885.1 000782 3645 MOV @IP+,W // ; fetch word address into W 885.2 000784 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 885.3 000786 ENDM 886 000786 887 000786 ;Z S= c-addr1 c-addr2 u -- n string compare 888 000786 ;Z S= n<0: s10: s1>s2 889 000786 HEADER SEQUAL,2,'S=',DOCODE 889.1 000000 PUBLIC SEQUAL 889.2 000786 .... DW link 889.3 000788 FF DB 0FFh ; not immediate 889.4 000789 link SET $ - 4e-core430G2553 - Page 65 889.5 000789 02 DB 2 889.6 00078A 533D DB 'S=' 889.7 00078C EVEN 889.8 00078C IF 'DOCODE'='DOCODE' 889.9 00078C .... SEQUAL: DW $+2 889.10 00078E ELSE 889.11 00078E SEQUAL: DW DOCODE 889.12 00078E ENDIF 889.13 00078E ENDM 890 00078E 3644 MOV @PSP+,W ; adrs2 891 000790 3A44 MOV @PSP+,X ; adrs1 892 000792 0793 CMP #0,TOS 893 000794 0A24 JZ SEQU_X 894 000796 FA960000 SEQU_1: CMP.B @W+,0(X) ; compare char1-char 2 895 00079A 0420 JNZ SMISMATCH 896 00079C 1A53 ADD #1,X 897 00079E 1783 SUB #1,TOS 898 0007A0 FA23 JNZ SEQU_1 899 0007A2 ; no mismatch found, strings are equal, TOS=0 900 0007A2 033C JMP SEQU_X 901 0007A4 ; mismatch found, CY clear if borrow set (s10: s1>s2 909 0007AE ; For Harvard model, c-addr1 is Data, c-addr2 is Header. 910 0007AE ; On MSP430, both use the same fetch instruction , so N= is the same as S=. 911 0007AE HEADER NEQUAL,2,'N=',SEQUAL+2 911.1 000000 PUBLIC NEQUAL 911.2 0007AE .... DW link 911.3 0007B0 FF DB 0FFh ; not immediate 911.4 0007B1 link SET $ 911.5 0007B1 02 DB 2 911.6 0007B2 4E3D DB 'N=' 911.7 0007B4 EVEN 911.8 0007B4 IF 'SEQUAL+2'='DOCODE' 911.9 0007B4 NEQUAL: DW $+2 911.10 0007B4 ELSE 911.11 0007B4 .... NEQUAL: DW SEQUAL+2 911.12 0007B6 ENDIF 911.13 0007B6 ENDM 912 0007B6 913 0007B6 ; ---------------------------------------------- ------------------------ 914 0007B6 ; TERMINAL I/O 915 0007B6 916 000000 PUBLIC DOKEY,DOEMIT 917 0007B6 918 0007B6 /* 919 0007B6 ;C EMIT c -- output character to console; core routine 920 0007B6 HEADER EMIT,4,'EMIT',DOCODE 921 0007B6 EMITLOOP: 922 0007B6 BIT.B #UCA0TXIFG,&IFG2 923 0007B6 JZ EMITLOOP 924 0007B6 MOV.B TOS,&UCA0TXBUF 925 0007B6 MOV @PSP+,TOS 926 0007B6 NEXT 927 0007B6 928 0007B6 ;C KEY -- c get character from - 4e-core430G2553 - Page 66 keyboard; core routine 929 0007B6 HEADER KEY,3,'KEY',DOCODE 930 0007B6 KEYLOOP: 931 0007B6 BIT.B #UCA0RXIFG,&IFG2 932 0007B6 JZ KEYLOOP 933 0007B6 SUB #2,PSP ; 1 push old TOS.. 934 0007B6 MOV TOS,0(PSP) ; 4 ..onto stack 935 0007B6 MOV.B &UCA0RXBUF,TOS ; read character into TOS 936 0007B6 donoop1: 937 0007B6 donext1: NEXT 938 0007B6 */ 939 0007B6 940 0007B6 ;C (EMIT) c -- output character to console; core routine 941 0007B6 HEADER DOEMIT,6,'(EMIT)',DOCODE 941.1 0007B6 PUBLIC DOEMIT 941.2 0007B6 .... DW link 941.3 0007B8 FF DB 0FFh ; not immediate 941.4 0007B9 link SET $ 941.5 0007B9 06 DB 6 941.6 0007BA 28454D495429 DB '(EMIT)' 941.7 0007C0 EVEN 941.8 0007C0 IF 'DOCODE'='DOCODE' 941.9 0007C0 .... DOEMIT: DW $+2 941.10 0007C2 ELSE 941.11 0007C2 DOEMIT: DW DOCODE 941.12 0007C2 ENDIF 941.13 0007C2 ENDM 942 0007C2 EMITLOOPx: 943 0007C2 E2B30300 BIT.B #UCA0TXIFG,&IFG2 944 0007C6 FD27 JZ EMITLOOPx 945 0007C8 C2476700 MOV.B TOS,&UCA0TXBUF 946 0007CC 3744 MOV @PSP+,TOS 947 0007CE NEXT 947.1 0007CE 3645 MOV @IP+,W // ; fetch word address into W 947.2 0007D0 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 947.3 0007D2 ENDM 948 0007D2 949 0007D2 ;C (KEY) -- c get character from keyboard; core routine 950 0007D2 HEADER DOKEY,5,'(KEY)',DOCODE 950.1 0007D2 PUBLIC DOKEY 950.2 0007D2 .... DW link 950.3 0007D4 FF DB 0FFh ; not immediate 950.4 0007D5 link SET $ 950.5 0007D5 05 DB 5 950.6 0007D6 284B455929 DB '(KEY)' 950.7 0007DB 00 EVEN 950.8 0007DC IF 'DOCODE'='DOCODE' 950.9 0007DC .... DOKEY: DW $+2 950.10 0007DE ELSE 950.11 0007DE DOKEY: DW DOCODE 950.12 0007DE ENDIF 950.13 0007DE ENDM 951 0007DE KEYLOOPx: 952 0007DE D2B30300 BIT.B #UCA0RXIFG,&IFG2 953 0007E2 FD27 JZ KEYLOOPx 954 0007E4 2483 SUB #2,PSP ; 1 push old TOS.. 955 0007E6 84470000 MOV TOS,0(PSP) ; 4 ..onto stack 956 0007EA 57426600 MOV.B &UCA0RXBUF,TOS ; read character into TOS 957 0007EE donoop: 958 0007EE donext: NEXT 958.1 0007EE 3645 MOV @IP+,W // ; fetch word address into W 958.2 0007F0 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 958.3 0007F2 ENDM 959 0007F2 - 4e-core430G2553 - Page 67 960 0007F2 961 0007F2 ;C KEY -- c get character from keyboard; vectored 962 0007F2 HEADER KEY,3,'KEY',DOCOLON 962.1 000000 PUBLIC KEY 962.2 0007F2 .... DW link 962.3 0007F4 FF DB 0FFh ; not immediate 962.4 0007F5 link SET $ 962.5 0007F5 03 DB 3 962.6 0007F6 4B4559 DB 'KEY' 962.7 0007F9 00 EVEN 962.8 0007FA IF 'DOCOLON'='DOCODE' 962.9 0007FA KEY: DW $+2 962.10 0007FA ELSE 962.11 0007FA .... KEY: DW DOCOLON 962.12 0007FC ENDIF 962.13 0007FC ENDM 963 0007FC ............* DW USERKEY,FETCH,EXECUTE,EXIT 964 000804 965 000804 ;C EMIT c -- output character to console; vectored 966 000804 HEADER EMIT,4,'EMIT',DOCOLON 966.1 000000 PUBLIC EMIT 966.2 000804 .... DW link 966.3 000806 FF DB 0FFh ; not immediate 966.4 000807 link SET $ 966.5 000807 04 DB 4 966.6 000808 454D4954 DB 'EMIT' 966.7 00080C EVEN 966.8 00080C IF 'DOCOLON'='DOCODE' 966.9 00080C EMIT: DW $+2 966.10 00080C ELSE 966.11 00080C .... EMIT: DW DOCOLON 966.12 00080E ENDIF 966.13 00080E ENDM 967 00080E ............* DW USEREMIT,FETCH,EXECUTE,EXIT 968 000816 969 000816 970 000816 ;X KEY? -- f return true if char waiting 971 000816 HEADER KEYQ,4,'KEY?',DOCODE 971.1 000000 PUBLIC KEYQ 971.2 000816 .... DW link 971.3 000818 FF DB 0FFh ; not immediate 971.4 000819 link SET $ 971.5 000819 04 DB 4 971.6 00081A 4B45593F DB 'KEY?' 971.7 00081E EVEN 971.8 00081E IF 'DOCODE'='DOCODE' 971.9 00081E .... KEYQ: DW $+2 971.10 000820 ELSE 971.11 000820 KEYQ: DW DOCODE 971.12 000820 ENDIF 971.13 000820 ENDM 972 000820 2483 SUB #2,PSP ; 1 push old TOS.. 973 000822 84470000 MOV TOS,0(PSP) ; 4 ..onto stack 974 000826 D2B30300 BIT.B #UCA0RXIFG,&IFG2 975 00082A 8622 JNZ TOSTRUE 976 00082C 743E JMP TOSFALSE 977 00082E 978 00082E ;X ZERO -- 0 put zero on stack. Often usesd word. 979 00082E HEADER ZERO,4,'ZERO',DOCON 979.1 000000 PUBLIC ZERO 979.2 00082E .... DW link 979.3 000830 FF DB 0FFh ; not immediate 979.4 000831 link SET $ 979.5 000831 04 DB 4 979.6 000832 5A45524F DB 'ZERO' 979.7 000836 EVEN 979.8 000836 IF 'DOCON'='DOCODE' 979.9 000836 ZERO: DW $+2 979.10 000836 ELSE 979.11 000836 .... ZERO: DW DOCON 979.12 000838 ENDIF 979.13 000838 ENDM - 4e-core430G2553 - Page 68 980 000838 0000 DW 0 981 00083A ; ---------------------------------------------- ------------------------ 982 00083A ; We #include the following source files, rather than compiling them 983 00083A ; separately, so that they can inherit the value of 'link'. 984 00083A 985 00083A #include "4e-deps430G2553.s43" 1 00083A ; ---------------------------------------------- ------------------------ 2 00083A ; 4e4th is a Forth based on CamelForth 3 00083A ; for the Texas Instruments MSP430 4 00083A ; 5 00083A ; This program is free software; you can redistribute it and/or modify 6 00083A ; it under the terms of the GNU General Public License as published by 7 00083A ; the Free Software Foundation; either version 3 of the License, or 8 00083A ; (at your option) any later version. 9 00083A ; 10 00083A ; This program is distributed in the hope that it will be useful, 11 00083A ; but WITHOUT ANY WARRANTY; without even the implied warranty of 12 00083A ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 00083A ; GNU General Public License for more details. 14 00083A ; 15 00083A ; You should have received a copy of the GNU General Public License 16 00083A ; along with this program. If not, see . 17 00083A ; 18 00083A ; See LICENSE TERMS in Brads file readme.txt as well. 19 00083A 20 00083A ; ---------------------------------------------- ------------------------ 21 00083A ; 4e-deps430.s43: CPU and Model Dependencies - MSP430G2553 22 00083A ; ---------------------------------------------- ------------------------ 23 00083A 24 00083A ; Forth words are documented as follows: 25 00083A ;x NAME stack -- stack description 26 00083A ; where x=C for ANS Forth Core words, X for ANS 27 00083A ; Extensions, Z for internal or private words. 28 00083A ; 29 00083A ; Indirect-Threaded Forth model for T.I. MSP430 30 00083A ; cell size is 16 bits (2 bytes) 31 00083A ; char size is 8 bits (1 byte) 32 00083A ; address unit is 8 bits (1 byte), i.e., addresses are byte-aligned. 33 00083A ; ---------------------------------------------- ------------------------ 34 00083A 35 00083A ; ---------------------------------------------- ------------------------ 36 00083A ; ALIGNMENT AND PORTABILITY OPERATORS 37 00083A ; Many of these are synonyms for other words, 38 00083A ; and so are defined as CODE words. 39 00083A 40 00083A ;C ALIGN -- align HERE 41 00083A ; IHERE 1 AND IALLOT ; 42 00083A HEADER ALIGNN,5,'ALIGN',DOCOLON 42.1 000000 PUBLIC ALIGNN 42.2 00083A .... DW link 42.3 00083C FF DB 0FFh ; not immediate 42.4 00083D link SET $ 42.5 00083D 05 DB 5 - 4e-core430G2553 - Page 69 42.6 00083E 414C49474E DB 'ALIGN' 42.7 000843 00 EVEN 42.8 000844 IF 'DOCOLON'='DOCODE' 42.9 000844 ALIGNN: DW $+2 42.10 000844 ELSE 42.11 000844 .... ALIGNN: DW DOCOLON 42.12 000846 ENDIF 42.13 000846 ENDM 43 000846 ........0100* DW IHERE,lit,1,ANDD,IALLOT,EXIT 44 000852 45 000852 ;C ALIGNED addr -- a-addr align given addr 46 000852 ; DUP 1 AND + ; 47 000852 HEADER ALIGNED,7,'ALIGNED',DOCOLON 47.1 000000 PUBLIC ALIGNED 47.2 000852 .... DW link 47.3 000854 FF DB 0FFh ; not immediate 47.4 000855 link SET $ 47.5 000855 07 DB 7 47.6 000856 414C49474E45* DB 'ALIGNED' 47.7 00085D 00 EVEN 47.8 00085E IF 'DOCOLON'='DOCODE' 47.9 00085E ALIGNED: DW $+2 47.10 00085E ELSE 47.11 00085E .... ALIGNED: DW DOCOLON 47.12 000860 ENDIF 47.13 000860 ENDM 48 000860 ........0100* DW DUP,lit,1,ANDD,PLUS,EXIT 49 00086C 50 00086C ;Z CELL -- n size of one cell 51 00086C HEADER CELL,4,'CELL',DOCON 51.1 000000 PUBLIC CELL 51.2 00086C .... DW link 51.3 00086E FF DB 0FFh ; not immediate 51.4 00086F link SET $ 51.5 00086F 04 DB 4 51.6 000870 43454C4C DB 'CELL' 51.7 000874 EVEN 51.8 000874 IF 'DOCON'='DOCODE' 51.9 000874 CELL: DW $+2 51.10 000874 ELSE 51.11 000874 .... CELL: DW DOCON 51.12 000876 ENDIF 51.13 000876 ENDM 52 000876 0200 dw 2 53 000878 54 000878 ;C CELL+ a-addr1 -- a-addr2 add cell size 55 000878 ; 2 + ; 56 000878 HEADER CELLPLUS,5,'CELL+',DOCODE 56.1 000000 PUBLIC CELLPLUS 56.2 000878 .... DW link 56.3 00087A FF DB 0FFh ; not immediate 56.4 00087B link SET $ 56.5 00087B 05 DB 5 56.6 00087C 43454C4C2B DB 'CELL+' 56.7 000881 00 EVEN 56.8 000882 IF 'DOCODE'='DOCODE' 56.9 000882 .... CELLPLUS: DW $+2 56.10 000884 ELSE 56.11 000884 CELLPLUS: DW DOCODE 56.12 000884 ENDIF 56.13 000884 ENDM 57 000884 2753 ADD #2,TOS 58 000886 B33F JMP donext 59 000888 60 000888 ;C CELLS n1 -- n2 cells->adrs units 61 000888 HEADER CELLS,5,'CELLS',TWOSTAR+2 61.1 000000 PUBLIC CELLS 61.2 000888 .... DW link 61.3 00088A FF DB 0FFh ; not immediate 61.4 00088B link SET $ 61.5 00088B 05 DB 5 61.6 00088C 43454C4C53 DB 'CELLS' 61.7 000891 00 EVEN 61.8 000892 IF 'TWOSTAR+2'='DOCODE' - 4e-core430G2553 - Page 70 61.9 000892 CELLS: DW $+2 61.10 000892 ELSE 61.11 000892 .... CELLS: DW TWOSTAR+2 61.12 000894 ENDIF 61.13 000894 ENDM 62 000894 63 000894 ;C CHAR+ c-addr1 -- c-addr2 add char size 64 000894 HEADER CHARPLUS,5,'CHAR+',ONEPLUS+2 64.1 000000 PUBLIC CHARPLUS 64.2 000894 .... DW link 64.3 000896 FF DB 0FFh ; not immediate 64.4 000897 link SET $ 64.5 000897 05 DB 5 64.6 000898 434841522B DB 'CHAR+' 64.7 00089D 00 EVEN 64.8 00089E IF 'ONEPLUS+2'='DOCODE' 64.9 00089E CHARPLUS: DW $+2 64.10 00089E ELSE 64.11 00089E .... CHARPLUS: DW ONEPLUS+2 64.12 0008A0 ENDIF 64.13 0008A0 ENDM 65 0008A0 66 0008A0 ;C CHARS n1 -- n2 chars->adrs units 67 0008A0 HEADER CHARS,5,'CHARS',donoop 67.1 000000 PUBLIC CHARS 67.2 0008A0 .... DW link 67.3 0008A2 FF DB 0FFh ; not immediate 67.4 0008A3 link SET $ 67.5 0008A3 05 DB 5 67.6 0008A4 4348415253 DB 'CHARS' 67.7 0008A9 00 EVEN 67.8 0008AA IF 'donoop'='DOCODE' 67.9 0008AA CHARS: DW $+2 67.10 0008AA ELSE 67.11 0008AA .... CHARS: DW donoop 67.12 0008AC ENDIF 67.13 0008AC ENDM 68 0008AC 69 0008AC ;C >BODY xt -- a-addr adrs of CREATE data 70 0008AC ; 2+ ; 8086 (3 byte CALL) 71 0008AC HEADER TOBODY,5,'>BODY',CELLPLUS+2 71.1 000000 PUBLIC TOBODY 71.2 0008AC .... DW link 71.3 0008AE FF DB 0FFh ; not immediate 71.4 0008AF link SET $ 71.5 0008AF 05 DB 5 71.6 0008B0 3E424F4459 DB '>BODY' 71.7 0008B5 00 EVEN 71.8 0008B6 IF 'CELLPLUS+2'='DOCODE' 71.9 0008B6 TOBODY: DW $+2 71.10 0008B6 ELSE 71.11 0008B6 .... TOBODY: DW CELLPLUS+2 71.12 0008B8 ENDIF 71.13 0008B8 ENDM 72 0008B8 73 0008B8 ;X COMPILE, xt -- append execution token 74 0008B8 ; I called this word ,XT before I discovered that it is defined in the 75 0008B8 ; ANSI standard as COMPILE,. On a DTC Forth this simply appends xt 76 0008B8 ; (like , ) but on an STC Forth this must append 'CALL xt'. 77 0008B8 HEADER COMMAXT,8,'COMPILE,',DOALIAS 77.1 000000 PUBLIC COMMAXT 77.2 0008B8 .... DW link 77.3 0008BA FF DB 0FFh ; not immediate 77.4 0008BB link SET $ 77.5 0008BB 08 DB 8 77.6 0008BC 434F4D50494C* DB 'COMPILE,' 77.7 0008C4 EVEN 77.8 0008C4 IF 'DOALIAS'='DOCODE' 77.9 0008C4 COMMAXT: DW $+2 77.10 0008C4 ELSE - 4e-core430G2553 - Page 71 77.11 0008C4 .... COMMAXT: DW DOALIAS 77.12 0008C6 ENDIF 77.13 0008C6 ENDM 78 0008C6 .... DW ICOMMA 79 0008C8 80 0008C8 ;Z !CF adrs cfa -- set code action of a word 81 0008C8 ; I! ; 82 0008C8 ; Indirect threaded model just stores adrs in cfa field. 83 0008C8 HEADER STORECF,3,'!CF',DOALIAS 83.1 000000 PUBLIC STORECF 83.2 0008C8 .... DW link 83.3 0008CA FF DB 0FFh ; not immediate 83.4 0008CB link SET $ 83.5 0008CB 03 DB 3 83.6 0008CC 214346 DB '!CF' 83.7 0008CF 00 EVEN 83.8 0008D0 IF 'DOALIAS'='DOCODE' 83.9 0008D0 STORECF: DW $+2 83.10 0008D0 ELSE 83.11 0008D0 .... STORECF: DW DOALIAS 83.12 0008D2 ENDIF 83.13 0008D2 ENDM 84 0008D2 .... DW ISTORE 85 0008D4 86 0008D4 ;Z ,CF adrs -- append a code field 87 0008D4 ; IHERE !CF 2 IALLOT ; MSP430 VERSION (2 bytes) 88 0008D4 HEADER COMMACF,3,',CF',DOCOLON 88.1 000000 PUBLIC COMMACF 88.2 0008D4 .... DW link 88.3 0008D6 FF DB 0FFh ; not immediate 88.4 0008D7 link SET $ 88.5 0008D7 03 DB 3 88.6 0008D8 2C4346 DB ',CF' 88.7 0008DB 00 EVEN 88.8 0008DC IF 'DOCOLON'='DOCODE' 88.9 0008DC COMMACF: DW $+2 88.10 0008DC ELSE 88.11 0008DC .... COMMACF: DW DOCOLON 88.12 0008DE ENDIF 88.13 0008DE ENDM 89 0008DE ............* DW IHERE,STORECF,lit,2,IALLOT,EXIT 90 0008EA 91 0008EA ;Z ,CALL adrs -- append a subroutine CALL 92 0008EA ; MSP430: 128x is call, Ad=11, Dreg=0000 (PC) thus append 12B0,adrs. 93 0008EA HEADER COMMACALL,5,',CALL',DOCOLON 93.1 000000 PUBLIC COMMACALL 93.2 0008EA .... DW link 93.3 0008EC FF DB 0FFh ; not immediate 93.4 0008ED link SET $ 93.5 0008ED 05 DB 5 93.6 0008EE 2C43414C4C DB ',CALL' 93.7 0008F3 00 EVEN 93.8 0008F4 IF 'DOCOLON'='DOCODE' 93.9 0008F4 COMMACALL: DW $+2 93.10 0008F4 ELSE 93.11 0008F4 .... COMMACALL: DW DOCOLON 93.12 0008F6 ENDIF 93.13 0008F6 ENDM 94 0008F6 ....B012....* DW lit,12B0h,ICOMMA,ICOMMA,EXIT 95 000900 96 000900 ;Z ,JMP adrs -- append an absolute 16-bit JMP (MOV #xx,PC) 97 000900 ; MSP430: opcode 4, Sreg=0000, Ad=0, As=11 (immed), Dreg=0000 (PC) 98 000900 ; thus append 4030,adrs. 99 000900 HEADER COMMAJMP,4,',JMP',DOCOLON 99.1 000000 PUBLIC COMMAJMP 99.2 000900 .... DW link 99.3 000902 FF DB 0FFh ; not immediate 99.4 000903 link SET $ 99.5 000903 04 DB 4 99.6 000904 2C4A4D50 DB ',JMP' 99.7 000908 EVEN - 4e-core430G2553 - Page 72 99.8 000908 IF 'DOCOLON'='DOCODE' 99.9 000908 COMMAJMP: DW $+2 99.10 000908 ELSE 99.11 000908 .... COMMAJMP: DW DOCOLON 99.12 00090A ENDIF 99.13 00090A ENDM 100 00090A ....3040....* DW lit,4030h,ICOMMA,ICOMMA,EXIT 101 000914 102 000914 ;Z !COLON -- change code field to DOCOLON 103 000914 ; -2 IALLOT DOCOLON-adrs ,CF ; 104 000914 ; This should be used immediately after CREATE. 105 000914 ; This is made a distinct word, because on an STC 106 000914 ; Forth, colon definitions have no code field. 107 000914 HEADER STORCOLON,6,'!COLON',DOCOLON 107.1 000000 PUBLIC STORCOLON 107.2 000914 .... DW link 107.3 000916 FF DB 0FFh ; not immediate 107.4 000917 link SET $ 107.5 000917 06 DB 6 107.6 000918 21434F4C4F4E DB '!COLON' 107.7 00091E EVEN 107.8 00091E IF 'DOCOLON'='DOCODE' 107.9 00091E STORCOLON: DW $+2 107.10 00091E ELSE 107.11 00091E .... STORCOLON: DW DOCOLON 107.12 000920 ENDIF 107.13 000920 ENDM 108 000920 ....FEFF.... DW lit,-2,IALLOT 109 000926 ............* DW lit,DOCOLON,COMMACF,EXIT 110 00092E 111 00092E ;Z ,EXIT -- append hi-level EXIT action 112 00092E ; ['] EXIT ,XT ; 113 00092E ; This is made a distinct word, because on an STC 114 00092E ; Forth, it appends a RET instruction, not an xt. 115 00092E HEADER CEXIT,5,',EXIT',DOCOLON 115.1 000000 PUBLIC CEXIT 115.2 00092E .... DW link 115.3 000930 FF DB 0FFh ; not immediate 115.4 000931 link SET $ 115.5 000931 05 DB 5 115.6 000932 2C45584954 DB ',EXIT' 115.7 000937 00 EVEN 115.8 000938 IF 'DOCOLON'='DOCODE' 115.9 000938 CEXIT: DW $+2 115.10 000938 ELSE 115.11 000938 .... CEXIT: DW DOCOLON 115.12 00093A ENDIF 115.13 00093A ENDM 116 00093A ............* DW lit,EXIT,COMMAXT,EXIT 117 000942 118 000942 ; ---------------------------------------------- ------------------------ 119 000942 ; CONTROL STRUCTURES 120 000942 ; These words allow Forth control structure words 121 000942 ; to be defined portably. 122 000942 123 000942 ;Z ,BRANCH xt -- append a branch instructio n 124 000942 ; xt is the branch operator to use, e.g. qbranch or (loop). 125 000942 ; It does NOT append the destination address. 126 000942 ; On the MSP430 this is equivalent to ,XT (above). 127 000942 HEADER COMMABRANCH,7,',BRANCH',DOALIAS 127.1 000000 PUBLIC COMMABRANCH 127.2 000942 .... DW link 127.3 000944 FF DB 0FFh ; not immediate 127.4 000945 link SET $ 127.5 000945 07 DB 7 - 4e-core430G2553 - Page 73 127.6 000946 2C4252414E43* DB ',BRANCH' 127.7 00094D 00 EVEN 127.8 00094E IF 'DOALIAS'='DOCODE' 127.9 00094E COMMABRANCH: DW $+2 127.10 00094E ELSE 127.11 00094E .... COMMABRANCH: DW DOALIAS 127.12 000950 ENDIF 127.13 000950 ENDM 128 000950 .... DW ICOMMA 129 000952 130 000952 ;Z ,DEST dest -- append a branch address 131 000952 ; IHERE - , ; 132 000952 ; This appends the given destination address to the branch instruction. 133 000952 ; The MSP430 uses relative addressing from the location of the offset cell, 134 000952 ; i.e., to branch to FOO the offset cell at $ contains FOO-$. 135 000952 HEADER COMMADEST,5,',DEST',DOCOLON 135.1 000000 PUBLIC COMMADEST 135.2 000952 .... DW link 135.3 000954 FF DB 0FFh ; not immediate 135.4 000955 link SET $ 135.5 000955 05 DB 5 135.6 000956 2C44455354 DB ',DEST' 135.7 00095B 00 EVEN 135.8 00095C IF 'DOCOLON'='DOCODE' 135.9 00095C COMMADEST: DW $+2 135.10 00095C ELSE 135.11 00095C .... COMMADEST: DW DOCOLON 135.12 00095E ENDIF 135.13 00095E ENDM 136 00095E ............* DW IHERE,MINUS,ICOMMA,EXIT 137 000966 138 000966 ;Z !DEST dest adrs -- change a branch dest'n 139 000966 ; TUCK - SWAP I! ; 140 000966 ; Changes the destination address found at 'adrs' to the given 'dest'. 141 000966 ; The MSP430 uses relative addressing from the location of the offset cell, 142 000966 ; i.e., to branch to FOO the offset cell at $ contains FOO-$. 143 000966 HEADER STOREDEST,5,'!DEST',DOCOLON 143.1 000000 PUBLIC STOREDEST 143.2 000966 .... DW link 143.3 000968 FF DB 0FFh ; not immediate 143.4 000969 link SET $ 143.5 000969 05 DB 5 143.6 00096A 2144455354 DB '!DEST' 143.7 00096F 00 EVEN 143.8 000970 IF 'DOCOLON'='DOCODE' 143.9 000970 STOREDEST: DW $+2 143.10 000970 ELSE 143.11 000970 .... STOREDEST: DW DOCOLON 143.12 000972 ENDIF 143.13 000972 ENDM 144 000972 ............* DW TUCK,MINUS,SWAP,ISTORE,EXIT 145 00097C 146 00097C ;Z ,NONE -- append a null destination (Flashable) 147 00097C ; CELL IALLOT ; 148 00097C ; When compiling in Flash ROM a branch to be resolved later, we must 149 00097C ; skip the cell so that it can be programmed at a later time. 150 00097C ; In general Flash memory can only be written once! 151 00097C ; ,NONE should be used wherever !DEST will resolve the branch. 152 00097C HEADER COMMANONE,5,',NONE',DOCOLON 152.1 000000 PUBLIC COMMANONE 152.2 00097C .... DW link 152.3 00097E FF DB 0FFh ; not immediate 152.4 00097F link SET $ 152.5 00097F 05 DB 5 152.6 000980 2C4E4F4E45 DB ',NONE' - 4e-core430G2553 - Page 74 152.7 000985 00 EVEN 152.8 000986 IF 'DOCOLON'='DOCODE' 152.9 000986 COMMANONE: DW $+2 152.10 000986 ELSE 152.11 000986 .... COMMANONE: DW DOCOLON 152.12 000988 ENDIF 152.13 000988 ENDM 153 000988 ............ DW CELL,IALLOT,EXIT 154 00098E 155 00098E ; ---------------------------------------------- ------------------------ 156 00098E ; HEADER STRUCTURE 157 00098E ; The structure of the Forth dictionary headers (name, link, immediate 158 00098E ; flag, and "smudge" bit) does not necessarily differ across CPUs. This 159 00098E ; structure is not easily factored into distinct "portable" words; 160 00098E ; instead, it is implicit in the definitions of FIND and CREATE, and 161 00098E ; also in NFA>LFA, NFA>CFA, IMMED?, IMMEDIATE, HIDE, and REVEAL. 162 00098E ; These words must be (substantially) rewritten if either the header 163 00098E ; structure or its inherent assumptions are changed. 164 00098E ; ---------------------------------------------- ------------------------ 165 00098E 986 00098E #include "4e-hilvl430G2553.s43" 1 00098E ; ---------------------------------------------- ------------------------ 2 00098E ; 4e4th is a Forth based on CamelForth 3 00098E ; for the Texas Instruments MSP430 4 00098E ; 5 00098E ; This program is free software; you can redistribute it and/or modify 6 00098E ; it under the terms of the GNU General Public License as published by 7 00098E ; the Free Software Foundation; either version 3 of the License, or 8 00098E ; (at your option) any later version. 9 00098E ; 10 00098E ; This program is distributed in the hope that it will be useful, 11 00098E ; but WITHOUT ANY WARRANTY; without even the implied warranty of 12 00098E ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 00098E ; GNU General Public License for more details. 14 00098E ; 15 00098E ; You should have received a copy of the GNU General Public License 16 00098E ; along with this program. If not, see . 17 00098E ; 18 00098E ; See LICENSE TERMS in Brads file readme.txt as well. 19 00098E 20 00098E ; ---------------------------------------------- ------------------------ 21 00098E ; 4e-hilvl430G2553.s43 - High Level Words - MSP430G2553 22 00098E ; ---------------------------------------------- ------------------------ 23 00098E 24 00098E ; Forth words are documented as follows: 25 00098E ;x NAME stack -- stack description 26 00098E ; where x=C for ANS Forth Core words, X for ANS 27 00098E ; Extensions, Z for internal or private words. 28 00098E ; ---------------------------------------------- ------------------------ 29 00098E ; REVISION HISTORY 30 00098E 31 00098E ; 17 November 2013 - 4e-core430G2553 - Page 75 32 00098E ; Comments about making ISR in 4e4th 33 00098E ; 05 June 2013 34 00098E ; WORDS can stop and go now. 35 00098E ; LABEL to build ISR code. 36 00098E ; INTERRUPT to store ISR address in Interrupt vector. 37 00098E ; VECSAVE VECRESTORE VECBACK added. 38 00098E ; 12 Jan 2013 Use CODE ... NEXT, END-CODE to build code primitives. 39 00098E ; Usage: CODE name opcode1 i, opcode2 i, opcode3 i, ... NEXT, END-CODE 40 00098E ; Example: See "Basics for an extern cross assembler" at end of file. 41 00098E ; 11 Jan 2013 made comments, new features and words: 42 00098E ; Indicate BASE in ok promt. 43 00098E ; 0U.R ( u n -- ) print u with n leading zeros. 44 00098E ; (VECWIPE) ( -- ) erase ISR flash. 45 00098E ; VECWIPE ( -- ) do (VECWIPE) and set default reset vector. 46 00098E ; cleaned up/added memory information words: 47 00098E ; RESETADR ( -- adr) reset vector address 48 00098E ; MEMBOT ( -- adr) bottom of USERflash 49 00098E ; MEMTOP ( -- adr) top of USERflash 50 00098E ; MEM ( -- u) unused bytes in flash 51 00098E ; UNUSED ( -- u) unused bytes in RAM 52 00098E ; VARBOT ( -- adr) bottom of variable area 53 00098E ; TOPSEG ( -- adr) bottom of top most flash segment 54 00098E ; VECBOT ( -- adr) bottom of interrupt vectors 55 00098E ; ? ( adr -- u ) display content of variable 56 00098E ; 08 Dez 2012 merged brads PARSE etc form camelforth/340 V4.1 57 00098E ; which fixes the empty string bug. 58 00098E ; Dez 2012 Added some features: 59 00098E ; Save variables to info-c and restore from there on COLD. 60 00098E ; Made upper most flash segment writable; you may write vectors now. 61 00098E ; VEC! (x adr -- ) store x to adr in top most segment 62 00098E ; VEC! will write _any_ flash location. !! dangerous!! 63 00098E ; VECWIPE will erase flash but not kernel, sets reset vector to boot 4e4th. 64 00098E ; Kernal is bigger now, user flash smaler; 65 00098E ; see: XLINK configuration file for MSP430G2553 4e-lnk430G2553.xcl 66 00098E ; 30 Mar 2012 mk fixed FM/MOD 67 00098E ; 26 Feb 2012 mk - adopted to MSP430G2553 68 00098E ; MEM ( -- n ) n = bytes left in flash 69 00098E ; FLASHEND constant MEMTOP 70 00098E ; FLASHSTART constant MEMBOT 71 00098E ; kernel at $E000, IDP = FLASHSTART = C000 72 00098E ; fixed backspace. 73 00098E ; ok promt at end of line. 74 00098E ; .S prints depth. 75 00098E ; 76 00098E ; 17 jan 09 bjr - changed label _DP to DDP for compatibility with token 77 00098E ; naming convention. Now uses DEST macro to compute branch offsets. 78 00098E ; 11 jan 09 bjr - modified QUIT for Xon/Xoff flow control 79 00098E ; 4 jan 09 bjr - created from Camel86h.asm. 80 00098E 81 00098E ; SYSTEM VARIABLES & CONSTANTS ================= - 4e-core430G2553 - Page 76 = 82 00098E 83 00098E ;Z u0 -- a-addr current user area adrs 84 00098E ; 0 USER U0 85 00098E HEADER U0,2,'U0',DOUSER 85.1 000000 PUBLIC U0 85.2 00098E .... DW link 85.3 000990 FF DB 0FFh ; not immediate 85.4 000991 link SET $ 85.5 000991 02 DB 2 85.6 000992 5530 DB 'U0' 85.7 000994 EVEN 85.8 000994 IF 'DOUSER'='DOCODE' 85.9 000994 U0: DW $+2 85.10 000994 ELSE 85.11 000994 .... U0: DW DOUSER 85.12 000996 ENDIF 85.13 000996 ENDM 86 000996 0000 DW 0 87 000998 88 000998 ;C >IN -- a-addr holds offset into TIB 89 000998 ; 2 USER >IN 90 000998 HEADER TOIN,3,'>IN',DOUSER 90.1 000000 PUBLIC TOIN 90.2 000998 .... DW link 90.3 00099A FF DB 0FFh ; not immediate 90.4 00099B link SET $ 90.5 00099B 03 DB 3 90.6 00099C 3E494E DB '>IN' 90.7 00099F 00 EVEN 90.8 0009A0 IF 'DOUSER'='DOCODE' 90.9 0009A0 TOIN: DW $+2 90.10 0009A0 ELSE 90.11 0009A0 .... TOIN: DW DOUSER 90.12 0009A2 ENDIF 90.13 0009A2 ENDM 91 0009A2 0200 DW 2 92 0009A4 93 0009A4 ;C BASE -- a-addr holds conversion radix 94 0009A4 ; 4 USER BASE 95 0009A4 HEADER BASE,4,'BASE',DOUSER 95.1 000000 PUBLIC BASE 95.2 0009A4 .... DW link 95.3 0009A6 FF DB 0FFh ; not immediate 95.4 0009A7 link SET $ 95.5 0009A7 04 DB 4 95.6 0009A8 42415345 DB 'BASE' 95.7 0009AC EVEN 95.8 0009AC IF 'DOUSER'='DOCODE' 95.9 0009AC BASE: DW $+2 95.10 0009AC ELSE 95.11 0009AC .... BASE: DW DOUSER 95.12 0009AE ENDIF 95.13 0009AE ENDM 96 0009AE 0400 DW 4 97 0009B0 98 0009B0 ;C STATE -- a-addr holds compiler state 99 0009B0 ; 6 USER STATE 100 0009B0 HEADER STATE,5,'STATE',DOUSER 100.1 000000 PUBLIC STATE 100.2 0009B0 .... DW link 100.3 0009B2 FF DB 0FFh ; not immediate 100.4 0009B3 link SET $ 100.5 0009B3 05 DB 5 100.6 0009B4 5354415445 DB 'STATE' 100.7 0009B9 00 EVEN 100.8 0009BA IF 'DOUSER'='DOCODE' 100.9 0009BA STATE: DW $+2 100.10 0009BA ELSE 100.11 0009BA .... STATE: DW DOUSER 100.12 0009BC ENDIF 100.13 0009BC ENDM 101 0009BC 0600 DW 6 102 0009BE - 4e-core430G2553 - Page 77 103 0009BE ;Z dp -- a-addr holds dictionary ptr 104 0009BE ; 8 USER DP 105 0009BE HEADER DDP,2,'DP',DOUSER 105.1 000000 PUBLIC DDP 105.2 0009BE .... DW link 105.3 0009C0 FF DB 0FFh ; not immediate 105.4 0009C1 link SET $ 105.5 0009C1 02 DB 2 105.6 0009C2 4450 DB 'DP' 105.7 0009C4 EVEN 105.8 0009C4 IF 'DOUSER'='DOCODE' 105.9 0009C4 DDP: DW $+2 105.10 0009C4 ELSE 105.11 0009C4 .... DDP: DW DOUSER 105.12 0009C6 ENDIF 105.13 0009C6 ENDM 106 0009C6 0800 DW 8 107 0009C8 108 0009C8 ;Z 'source -- a-addr two cells: len, adrs 109 0009C8 ; 10 USER 'SOURCE 110 0009C8 HEADER TICKSOURCE,7,'\'SOURCE',DOUSER 110.1 000000 PUBLIC TICKSOURCE 110.2 0009C8 .... DW link 110.3 0009CA FF DB 0FFh ; not immediate 110.4 0009CB link SET $ 110.5 0009CB 07 DB 7 110.6 0009CC 27534F555243* DB '\'SOURCE' 110.7 0009D3 00 EVEN 110.8 0009D4 IF 'DOUSER'='DOCODE' 110.9 0009D4 TICKSOURCE: DW $+2 110.10 0009D4 ELSE 110.11 0009D4 .... TICKSOURCE: DW DOUSER 110.12 0009D6 ENDIF 110.13 0009D6 ENDM 111 0009D6 0A00 DW 10 112 0009D8 113 0009D8 ;Z latest -- a-addr last word in dict. 114 0009D8 ; 14 USER LATEST 115 0009D8 HEADER LATEST,6,'LATEST',DOUSER 115.1 000000 PUBLIC LATEST 115.2 0009D8 .... DW link 115.3 0009DA FF DB 0FFh ; not immediate 115.4 0009DB link SET $ 115.5 0009DB 06 DB 6 115.6 0009DC 4C4154455354 DB 'LATEST' 115.7 0009E2 EVEN 115.8 0009E2 IF 'DOUSER'='DOCODE' 115.9 0009E2 LATEST: DW $+2 115.10 0009E2 ELSE 115.11 0009E2 .... LATEST: DW DOUSER 115.12 0009E4 ENDIF 115.13 0009E4 ENDM 116 0009E4 0E00 DW 14 117 0009E6 118 0009E6 ;Z hp -- a-addr HOLD pointer 119 0009E6 ; 16 USER HP 120 0009E6 HEADER HP,2,'HP',DOUSER 120.1 000000 PUBLIC HP 120.2 0009E6 .... DW link 120.3 0009E8 FF DB 0FFh ; not immediate 120.4 0009E9 link SET $ 120.5 0009E9 02 DB 2 120.6 0009EA 4850 DB 'HP' 120.7 0009EC EVEN 120.8 0009EC IF 'DOUSER'='DOCODE' 120.9 0009EC HP: DW $+2 120.10 0009EC ELSE 120.11 0009EC .... HP: DW DOUSER 120.12 0009EE ENDIF 120.13 0009EE ENDM 121 0009EE 1000 DW 16 122 0009F0 123 0009F0 ;Z LP -- a-addr Leave-stack pointer 124 0009F0 ; 18 USER LP 125 0009F0 HEADER LP,2,'LP',DOUSER - 4e-core430G2553 - Page 78 125.1 000000 PUBLIC LP 125.2 0009F0 .... DW link 125.3 0009F2 FF DB 0FFh ; not immediate 125.4 0009F3 link SET $ 125.5 0009F3 02 DB 2 125.6 0009F4 4C50 DB 'LP' 125.7 0009F6 EVEN 125.8 0009F6 IF 'DOUSER'='DOCODE' 125.9 0009F6 LP: DW $+2 125.10 0009F6 ELSE 125.11 0009F6 .... LP: DW DOUSER 125.12 0009F8 ENDIF 125.13 0009F8 ENDM 126 0009F8 1200 DW 18 127 0009FA 128 0009FA ;Z IDP -- a-addr ROM dictionary pointer 129 0009FA ; 20 USER IDP 130 0009FA HEADER IDP,3,'IDP',DOUSER 130.1 000000 PUBLIC IDP 130.2 0009FA .... DW link 130.3 0009FC FF DB 0FFh ; not immediate 130.4 0009FD link SET $ 130.5 0009FD 03 DB 3 130.6 0009FE 494450 DB 'IDP' 130.7 000A01 00 EVEN 130.8 000A02 IF 'DOUSER'='DOCODE' 130.9 000A02 IDP: DW $+2 130.10 000A02 ELSE 130.11 000A02 .... IDP: DW DOUSER 130.12 000A04 ENDIF 130.13 000A04 ENDM 131 000A04 1400 DW 20 132 000A06 133 000A06 ;Z NEWEST -- a-addr temporary LATEST storage 134 000A06 ; 22 USER NEWEST 135 000A06 HEADER NEWEST,6,'NEWEST',DOUSER 135.1 000000 PUBLIC NEWEST 135.2 000A06 .... DW link 135.3 000A08 FF DB 0FFh ; not immediate 135.4 000A09 link SET $ 135.5 000A09 06 DB 6 135.6 000A0A 4E4557455354 DB 'NEWEST' 135.7 000A10 EVEN 135.8 000A10 IF 'DOUSER'='DOCODE' 135.9 000A10 NEWEST: DW $+2 135.10 000A10 ELSE 135.11 000A10 .... NEWEST: DW DOUSER 135.12 000A12 ENDIF 135.13 000A12 ENDM 136 000A12 1600 DW 22 137 000A14 138 000A14 ;Z APP -- a-addr app pointer ( was TURNKEY) 139 000A14 ; 24 USER APP 140 000A14 HEADER APP,3,'APP',DOUSER 140.1 000000 PUBLIC APP 140.2 000A14 .... DW link 140.3 000A16 FF DB 0FFh ; not immediate 140.4 000A17 link SET $ 140.5 000A17 03 DB 3 140.6 000A18 415050 DB 'APP' 140.7 000A1B 00 EVEN 140.8 000A1C IF 'DOUSER'='DOCODE' 140.9 000A1C APP: DW $+2 140.10 000A1C ELSE 140.11 000A1C .... APP: DW DOUSER 140.12 000A1E ENDIF 140.13 000A1E ENDM 141 000A1E 1800 DW 24 142 000A20 143 000A20 ;Z CAPS -- a-addr capitalize words pointer 144 000A20 ; 26 USER CAPS 145 000A20 HEADER CAPS,4,'CAPS',DOUSER 145.1 000000 PUBLIC CAPS 145.2 000A20 .... DW link - 4e-core430G2553 - Page 79 145.3 000A22 FF DB 0FFh ; not immediate 145.4 000A23 link SET $ 145.5 000A23 04 DB 4 145.6 000A24 43415053 DB 'CAPS' 145.7 000A28 EVEN 145.8 000A28 IF 'DOUSER'='DOCODE' 145.9 000A28 CAPS: DW $+2 145.10 000A28 ELSE 145.11 000A28 .... CAPS: DW DOUSER 145.12 000A2A ENDIF 145.13 000A2A ENDM 146 000A2A 1A00 DW 26 147 000A2C 148 000A2C ;Z USERKEY -- a-addr KEY pointer 149 000A2C ; 28 USER KEY 150 000A2C HEADER USERKEY,7,'USERKEY',DOUSER 150.1 000000 PUBLIC USERKEY 150.2 000A2C .... DW link 150.3 000A2E FF DB 0FFh ; not immediate 150.4 000A2F link SET $ 150.5 000A2F 07 DB 7 150.6 000A30 555345524B45* DB 'USERKEY' 150.7 000A37 00 EVEN 150.8 000A38 IF 'DOUSER'='DOCODE' 150.9 000A38 USERKEY: DW $+2 150.10 000A38 ELSE 150.11 000A38 .... USERKEY: DW DOUSER 150.12 000A3A ENDIF 150.13 000A3A ENDM 151 000A3A 1C00 DW 28 152 000A3C 153 000A3C ;Z USEREMIT -- a-addr EMIT pointer 154 000A3C ; 30 USER EMIT 155 000A3C HEADER USEREMIT,8,'USEREMIT',DOUSER 155.1 000000 PUBLIC USEREMIT 155.2 000A3C .... DW link 155.3 000A3E FF DB 0FFh ; not immediate 155.4 000A3F link SET $ 155.5 000A3F 08 DB 8 155.6 000A40 55534552454D* DB 'USEREMIT' 155.7 000A48 EVEN 155.8 000A48 IF 'DOUSER'='DOCODE' 155.9 000A48 USEREMIT: DW $+2 155.10 000A48 ELSE 155.11 000A48 .... USEREMIT: DW DOUSER 155.12 000A4A ENDIF 155.13 000A4A ENDM 156 000A4A 1E00 DW 30 157 000A4C 158 000A4C ;Z NEWLINE -- a-addr CR pointer 159 000A4C ; 32 USER 160 000A4C HEADER NEWLINE,7,'NEWLINE',DOUSER 160.1 000000 PUBLIC NEWLINE 160.2 000A4C .... DW link 160.3 000A4E FF DB 0FFh ; not immediate 160.4 000A4F link SET $ 160.5 000A4F 07 DB 7 160.6 000A50 4E45574C494E* DB 'NEWLINE' 160.7 000A57 00 EVEN 160.8 000A58 IF 'DOUSER'='DOCODE' 160.9 000A58 NEWLINE: DW $+2 160.10 000A58 ELSE 160.11 000A58 .... NEWLINE: DW DOUSER 160.12 000A5A ENDIF 160.13 000A5A ENDM 161 000A5A 2000 DW 32 162 000A5C 163 000A5C ; 2 more for savety 34, 36 164 000A5C 165 000A5C 166 000A5C 167 000A5C ;X PAD -- a-addr user PAD buffer 168 000A5C ; = end of hold area! 169 000A5C HEADER PAD,3,'PAD',DOUSER 169.1 000000 PUBLIC PAD 169.2 000A5C .... DW link - 4e-core430G2553 - Page 80 169.3 000A5E FF DB 0FFh ; not immediate 169.4 000A5F link SET $ 169.5 000A5F 03 DB 3 169.6 000A60 504144 DB 'PAD' 169.7 000A63 00 EVEN 169.8 000A64 IF 'DOUSER'='DOCODE' 169.9 000A64 PAD: DW $+2 169.10 000A64 ELSE 169.11 000A64 .... PAD: DW DOUSER 169.12 000A66 ENDIF 169.13 000A66 ENDM 170 000A66 .... DW PADAREA-UAREA 171 000A68 172 000A68 ;Z l0 -- a-addr bottom of Leave stack 173 000A68 HEADER L0,2,'L0',DOUSER 173.1 000000 PUBLIC L0 173.2 000A68 .... DW link 173.3 000A6A FF DB 0FFh ; not immediate 173.4 000A6B link SET $ 173.5 000A6B 02 DB 2 173.6 000A6C 4C30 DB 'L0' 173.7 000A6E EVEN 173.8 000A6E IF 'DOUSER'='DOCODE' 173.9 000A6E L0: DW $+2 173.10 000A6E ELSE 173.11 000A6E .... L0: DW DOUSER 173.12 000A70 ENDIF 173.13 000A70 ENDM 174 000A70 .... DW LSTACK-UAREA 175 000A72 176 000A72 ;Z r0 -- a-addr end of return stack 177 000A72 HEADER RZERO,2,'R0',DOUSER 177.1 000000 PUBLIC RZERO 177.2 000A72 .... DW link 177.3 000A74 FF DB 0FFh ; not immediate 177.4 000A75 link SET $ 177.5 000A75 02 DB 2 177.6 000A76 5230 DB 'R0' 177.7 000A78 EVEN 177.8 000A78 IF 'DOUSER'='DOCODE' 177.9 000A78 RZERO: DW $+2 177.10 000A78 ELSE 177.11 000A78 .... RZERO: DW DOUSER 177.12 000A7A ENDIF 177.13 000A7A ENDM 178 000A7A .... DW RSTACK-UAREA 179 000A7C 180 000A7C ;Z s0 -- a-addr end of parameter stack 181 000A7C HEADER S0,2,'S0',DOUSER 181.1 000000 PUBLIC S0 181.2 000A7C .... DW link 181.3 000A7E FF DB 0FFh ; not immediate 181.4 000A7F link SET $ 181.5 000A7F 02 DB 2 181.6 000A80 5330 DB 'S0' 181.7 000A82 EVEN 181.8 000A82 IF 'DOUSER'='DOCODE' 181.9 000A82 S0: DW $+2 181.10 000A82 ELSE 181.11 000A82 .... S0: DW DOUSER 181.12 000A84 ENDIF 181.13 000A84 ENDM 182 000A84 .... DW PSTACK-UAREA 183 000A86 184 000A86 ;X tib -- a-addr Terminal Input Buffer 185 000A86 ; HEX 80 USER TIB 8086: above user area 186 000A86 HEADER TIB,3,'TIB',DOUSER 186.1 000000 PUBLIC TIB 186.2 000A86 .... DW link 186.3 000A88 FF DB 0FFh ; not immediate 186.4 000A89 link SET $ 186.5 000A89 03 DB 3 186.6 000A8A 544942 DB 'TIB' - 4e-core430G2553 - Page 81 186.7 000A8D 00 EVEN 186.8 000A8E IF 'DOUSER'='DOCODE' 186.9 000A8E TIB: DW $+2 186.10 000A8E ELSE 186.11 000A8E .... TIB: DW DOUSER 186.12 000A90 ENDIF 186.13 000A90 ENDM 187 000A90 .... DW TIBAREA-UAREA 188 000A92 189 000A92 ;Z tibsize -- n size of TIB 190 000A92 HEADER TIBSIZE,7,'TIBSIZE',DOCON 190.1 000000 PUBLIC TIBSIZE 190.2 000A92 .... DW link 190.3 000A94 FF DB 0FFh ; not immediate 190.4 000A95 link SET $ 190.5 000A95 07 DB 7 190.6 000A96 54494253495A* DB 'TIBSIZE' 190.7 000A9D 00 EVEN 190.8 000A9E IF 'DOCON'='DOCODE' 190.9 000A9E TIBSIZE: DW $+2 190.10 000A9E ELSE 190.11 000A9E .... TIBSIZE: DW DOCON 190.12 000AA0 ENDIF 190.13 000AA0 ENDM 191 000AA0 .... DW TIB_SIZE-2 ; 2 chars safety zone 192 000AA2 193 000AA2 ;C BL -- char an ASCII space 194 000AA2 HEADER BLANK,2,'BL',DOCON 194.1 000000 PUBLIC BLANK 194.2 000AA2 .... DW link 194.3 000AA4 FF DB 0FFh ; not immediate 194.4 000AA5 link SET $ 194.5 000AA5 02 DB 2 194.6 000AA6 424C DB 'BL' 194.7 000AA8 EVEN 194.8 000AA8 IF 'DOCON'='DOCODE' 194.9 000AA8 BLANK: DW $+2 194.10 000AA8 ELSE 194.11 000AA8 .... BLANK: DW DOCON 194.12 000AAA ENDIF 194.13 000AAA ENDM 195 000AAA 2000 DW 20h 196 000AAC 197 000AAC ;Z uinit -- addr initial values for user area 198 000AAC HEADER UINIT,5,'UINIT',DOROM 198.1 000000 PUBLIC UINIT 198.2 000AAC .... DW link 198.3 000AAE FF DB 0FFh ; not immediate 198.4 000AAF link SET $ 198.5 000AAF 05 DB 5 198.6 000AB0 55494E4954 DB 'UINIT' 198.7 000AB5 00 EVEN 198.8 000AB6 IF 'DOROM'='DOCODE' 198.9 000AB6 UINIT: DW $+2 198.10 000AB6 ELSE 198.11 000AB6 .... UINIT: DW DOROM 198.12 000AB8 ENDIF 198.13 000AB8 ENDM 199 000AB8 uinitstart: 200 000AB8 000000000A00* DW 0,0,10,0 ; reserved,>IN,BASE,STAT E ; start in HEX mk 201 000AC0 .... DW RAMDICT ; DP 202 000AC2 00000000 DW 0,0 ; SOURCE init'd elsewhere 203 000AC6 .... DW lastword ; LATEST 204 000AC8 00000000 DW 0,0 ; HP,LP init'd elsewhere 205 000ACC 00C0 DW USERFLASHSTART ; IDP 206 000ACE 0000 DW 0 ; NEWEST not init'd 207 000AD0 .... DW DOTCOLD ; APP vector; default is .COLD 208 000AD2 FFFF DW -1 ; CAPS flag; default is TRUE 209 000AD4 .... DW DOKEY ; KEY vector - 4e-core430G2553 - Page 82 210 000AD6 .... DW DOEMIT ; EMIT vector 211 000AD8 .... DW DOCR ; CR vector 212 000ADA uinitend: 213 000022 uareasize = uinitend-uinitstart 214 000ADA 215 000ADA /* not there mk 216 000ADA ; RAM interrupt vectors, 15 vectors of 2 cells each 217 000ADA MOV #nullirq,PC 218 000ADA MOV #nullirq,PC 219 000ADA MOV #nullirq,PC 220 000ADA MOV #nullirq,PC 221 000ADA MOV #nullirq,PC 222 000ADA MOV #nullirq,PC 223 000ADA MOV #nullirq,PC 224 000ADA MOV #nullirq,PC 225 000ADA MOV #nullirq,PC 226 000ADA MOV #nullirq,PC 227 000ADA MOV #nullirq,PC 228 000ADA MOV #nullirq,PC 229 000ADA MOV #nullirq,PC 230 000ADA MOV #nullirq,PC 231 000ADA MOV #nullirq,PC 232 000ADA */ 233 000ADA 234 000ADA ;Z #init -- n #bytes of user area init data 235 000ADA HEADER NINIT,5,'#INIT',DOCON 235.1 000000 PUBLIC NINIT 235.2 000ADA .... DW link 235.3 000ADC FF DB 0FFh ; not immediate 235.4 000ADD link SET $ 235.5 000ADD 05 DB 5 235.6 000ADE 23494E4954 DB '#INIT' 235.7 000AE3 00 EVEN 235.8 000AE4 IF 'DOCON'='DOCODE' 235.9 000AE4 NINIT: DW $+2 235.10 000AE4 ELSE 235.11 000AE4 .... NINIT: DW DOCON 235.12 000AE6 ENDIF 235.13 000AE6 ENDM 236 000AE6 2200 DW uareasize 237 000AE8 238 000AE8 239 000000 EXTERN cor,infoB,AppU0,infoC,infoD 240 000AE8 ;Z COR -- adr cause of reset 241 000AE8 HEADER COR,3,'COR',DOCON 241.1 000000 PUBLIC COR 241.2 000AE8 .... DW link 241.3 000AEA FF DB 0FFh ; not immediate 241.4 000AEB link SET $ 241.5 000AEB 03 DB 3 241.6 000AEC 434F52 DB 'COR' 241.7 000AEF 00 EVEN 241.8 000AF0 IF 'DOCON'='DOCODE' 241.9 000AF0 COR: DW $+2 241.10 000AF0 ELSE 241.11 000AF0 .... COR: DW DOCON 241.12 000AF2 ENDIF 241.13 000AF2 ENDM 242 000AF2 .... DW cor 243 000AF4 244 000AF4 ;Z INFOB -- adr start of info B segment 245 000AF4 HEADER INFOB,5,'INFOB',DOCON 245.1 000000 PUBLIC INFOB 245.2 000AF4 .... DW link 245.3 000AF6 FF DB 0FFh ; not immediate 245.4 000AF7 link SET $ 245.5 000AF7 05 DB 5 245.6 000AF8 494E464F42 DB 'INFOB' 245.7 000AFD 00 EVEN 245.8 000AFE IF 'DOCON'='DOCODE' 245.9 000AFE INFOB: DW $+2 245.10 000AFE ELSE 245.11 000AFE .... INFOB: DW DOCON 245.12 000B00 ENDIF 245.13 000B00 ENDM - 4e-core430G2553 - Page 83 246 000B00 .... DW infoB 247 000B02 248 000B02 ;Z INFOC -- adr start of info C segment 249 000B02 HEADER INFOC,5,'INFOC',DOCON 249.1 000000 PUBLIC INFOC 249.2 000B02 .... DW link 249.3 000B04 FF DB 0FFh ; not immediate 249.4 000B05 link SET $ 249.5 000B05 05 DB 5 249.6 000B06 494E464F43 DB 'INFOC' 249.7 000B0B 00 EVEN 249.8 000B0C IF 'DOCON'='DOCODE' 249.9 000B0C INFOC: DW $+2 249.10 000B0C ELSE 249.11 000B0C .... INFOC: DW DOCON 249.12 000B0E ENDIF 249.13 000B0E ENDM 250 000B0E .... DW infoC 251 000B10 252 000B10 ;Z INFOD -- adr start of info C segment 253 000B10 HEADER INFOD,5,'INFOD',DOCON 253.1 000000 PUBLIC INFOD 253.2 000B10 .... DW link 253.3 000B12 FF DB 0FFh ; not immediate 253.4 000B13 link SET $ 253.5 000B13 05 DB 5 253.6 000B14 494E464F44 DB 'INFOD' 253.7 000B19 00 EVEN 253.8 000B1A IF 'DOCON'='DOCODE' 253.9 000B1A INFOD: DW $+2 253.10 000B1A ELSE 253.11 000B1A .... INFOD: DW DOCON 253.12 000B1C ENDIF 253.13 000B1C ENDM 254 000B1C .... DW infoD 255 000B1E 256 000B1E ;Z APPU0 -- adr start of Application user area 257 000B1E HEADER APPU0,5,'APPU0',DOCON 257.1 000000 PUBLIC APPU0 257.2 000B1E .... DW link 257.3 000B20 FF DB 0FFh ; not immediate 257.4 000B21 link SET $ 257.5 000B21 05 DB 5 257.6 000B22 4150505530 DB 'APPU0' 257.7 000B27 00 EVEN 257.8 000B28 IF 'DOCON'='DOCODE' 257.9 000B28 APPU0: DW $+2 257.10 000B28 ELSE 257.11 000B28 .... APPU0: DW DOCON 257.12 000B2A ENDIF 257.13 000B2A ENDM 258 000B2A .... DW AppU0 259 000B2C 260 000B2C 261 000B2C ; ARITHMETIC OPERATORS ========================= = 262 000B2C 263 000B2C ;C S>D n -- d single -> double prec. 264 000B2C ; DUP 0< ; 265 000B2C HEADER STOD,3,'S>D',DOCOLON 265.1 000000 PUBLIC STOD 265.2 000B2C .... DW link 265.3 000B2E FF DB 0FFh ; not immediate 265.4 000B2F link SET $ 265.5 000B2F 03 DB 3 265.6 000B30 533E44 DB 'S>D' 265.7 000B33 00 EVEN 265.8 000B34 IF 'DOCOLON'='DOCODE' 265.9 000B34 STOD: DW $+2 265.10 000B34 ELSE 265.11 000B34 .... STOD: DW DOCOLON 265.12 000B36 ENDIF 265.13 000B36 ENDM 266 000B36 ............ DW DUP,ZEROLESS,EXIT - 4e-core430G2553 - Page 84 267 000B3C 268 000B3C ;Z ?NEGATE n1 n2 -- n3 negate n1 if n2 negative 269 000B3C ; 0< IF NEGATE THEN ; ...a common factor 270 000B3C HEADER QNEGATE,7,'?NEGATE',DOCOLON 270.1 000000 PUBLIC QNEGATE 270.2 000B3C .... DW link 270.3 000B3E FF DB 0FFh ; not immediate 270.4 000B3F link SET $ 270.5 000B3F 07 DB 7 270.6 000B40 3F4E45474154* DB '?NEGATE' 270.7 000B47 00 EVEN 270.8 000B48 IF 'DOCOLON'='DOCODE' 270.9 000B48 QNEGATE: DW $+2 270.10 000B48 ELSE 270.11 000B48 .... QNEGATE: DW DOCOLON 270.12 000B4A ENDIF 270.13 000B4A ENDM 271 000B4A ........ DW ZEROLESS,qbran 272 000B4E DEST QNEG1 272.1 000B4E 0400 DW QNEG1-$ 272.2 000B50 ENDM 273 000B50 .... DW NEGATE 274 000B52 .... QNEG1: DW EXIT 275 000B54 276 000B54 ;C ABS n1 -- +n2 absolute value 277 000B54 ; DUP ?NEGATE ; 278 000B54 HEADER ABBS,3,'ABS',DOCOLON 278.1 000000 PUBLIC ABBS 278.2 000B54 .... DW link 278.3 000B56 FF DB 0FFh ; not immediate 278.4 000B57 link SET $ 278.5 000B57 03 DB 3 278.6 000B58 414253 DB 'ABS' 278.7 000B5B 00 EVEN 278.8 000B5C IF 'DOCOLON'='DOCODE' 278.9 000B5C ABBS: DW $+2 278.10 000B5C ELSE 278.11 000B5C .... ABBS: DW DOCOLON 278.12 000B5E ENDIF 278.13 000B5E ENDM 279 000B5E ............ DW DUP,QNEGATE,EXIT 280 000B64 281 000B64 ;X DNEGATE d1 -- d2 negate double precision 282 000B64 ; SWAP INVERT SWAP INVERT 1 M+ ; 283 000B64 HEADER DNEGATE,7,'DNEGATE',DOCOLON 283.1 000000 PUBLIC DNEGATE 283.2 000B64 .... DW link 283.3 000B66 FF DB 0FFh ; not immediate 283.4 000B67 link SET $ 283.5 000B67 07 DB 7 283.6 000B68 444E45474154* DB 'DNEGATE' 283.7 000B6F 00 EVEN 283.8 000B70 IF 'DOCOLON'='DOCODE' 283.9 000B70 DNEGATE: DW $+2 283.10 000B70 ELSE 283.11 000B70 .... DNEGATE: DW DOCOLON 283.12 000B72 ENDIF 283.13 000B72 ENDM 284 000B72 ............* DW SWAP,INVERT,SWAP,INVERT,lit,1,MPLUS 285 000B80 .... DW EXIT 286 000B82 287 000B82 ;Z ?DNEGATE d1 n -- d2 negate d1 if n negative 288 000B82 ; 0< IF DNEGATE THEN ; ...a common factor 289 000B82 HEADER QDNEGATE,8,'?DNEGATE',DOCOLON 289.1 000000 PUBLIC QDNEGATE 289.2 000B82 .... DW link 289.3 000B84 FF DB 0FFh ; not immediate 289.4 000B85 link SET $ 289.5 000B85 08 DB 8 289.6 000B86 3F444E454741* DB '?DNEGATE' 289.7 000B8E EVEN 289.8 000B8E IF 'DOCOLON'='DOCODE' 289.9 000B8E QDNEGATE: DW $+2 - 4e-core430G2553 - Page 85 289.10 000B8E ELSE 289.11 000B8E .... QDNEGATE: DW DOCOLON 289.12 000B90 ENDIF 289.13 000B90 ENDM 290 000B90 ........ DW ZEROLESS,qbran 291 000B94 DEST DNEG1 291.1 000B94 0400 DW DNEG1-$ 291.2 000B96 ENDM 292 000B96 .... DW DNEGATE 293 000B98 .... DNEG1: DW EXIT 294 000B9A 295 000B9A ;X DABS d1 -- +d2 absolute value dbl.prec. 296 000B9A ; DUP ?DNEGATE ; 297 000B9A HEADER DABS,4,'DABS',DOCOLON 297.1 000000 PUBLIC DABS 297.2 000B9A .... DW link 297.3 000B9C FF DB 0FFh ; not immediate 297.4 000B9D link SET $ 297.5 000B9D 04 DB 4 297.6 000B9E 44414253 DB 'DABS' 297.7 000BA2 EVEN 297.8 000BA2 IF 'DOCOLON'='DOCODE' 297.9 000BA2 DABS: DW $+2 297.10 000BA2 ELSE 297.11 000BA2 .... DABS: DW DOCOLON 297.12 000BA4 ENDIF 297.13 000BA4 ENDM 298 000BA4 ............ DW DUP,QDNEGATE,EXIT 299 000BAA 300 000BAA ;C M* n1 n2 -- d signed 16*16->32 multiply 301 000BAA ; 2DUP XOR >R carries sign of the result 302 000BAA ; SWAP ABS SWAP ABS UM* 303 000BAA ; R> ?DNEGATE ; 304 000BAA HEADER MSTAR,2,'M*',DOCOLON 304.1 000000 PUBLIC MSTAR 304.2 000BAA .... DW link 304.3 000BAC FF DB 0FFh ; not immediate 304.4 000BAD link SET $ 304.5 000BAD 02 DB 2 304.6 000BAE 4D2A DB 'M*' 304.7 000BB0 EVEN 304.8 000BB0 IF 'DOCOLON'='DOCODE' 304.9 000BB0 MSTAR: DW $+2 304.10 000BB0 ELSE 304.11 000BB0 .... MSTAR: DW DOCOLON 304.12 000BB2 ENDIF 304.13 000BB2 ENDM 305 000BB2 ............ DW TWODUP,XORR,TOR 306 000BB8 ............* DW SWAP,ABBS,SWAP,ABBS,UMSTAR 307 000BC2 ............ DW RFROM,QDNEGATE,EXIT 308 000BC8 309 000BC8 ;C SM/REM d1 n1 -- n2 n3 symmetric signed div 310 000BC8 ; 2DUP XOR >R sign of quotient 311 000BC8 ; OVER >R sign of remainder 312 000BC8 ; ABS >R DABS R> UM/MOD 313 000BC8 ; SWAP R> ?NEGATE 314 000BC8 ; SWAP R> ?NEGATE ; 315 000BC8 ; Ref. dpANS-6 section 3.2.2.1. 316 000BC8 HEADER SMSLASHREM,6,'SM/REM',DOCOLON 316.1 000000 PUBLIC SMSLASHREM 316.2 000BC8 .... DW link 316.3 000BCA FF DB 0FFh ; not immediate 316.4 000BCB link SET $ 316.5 000BCB 06 DB 6 316.6 000BCC 534D2F52454D DB 'SM/REM' 316.7 000BD2 EVEN 316.8 000BD2 IF 'DOCOLON'='DOCODE' 316.9 000BD2 SMSLASHREM: DW $+2 316.10 000BD2 ELSE 316.11 000BD2 .... SMSLASHREM: DW DOCOLON 316.12 000BD4 ENDIF 316.13 000BD4 ENDM 317 000BD4 ............* DW TWODUP,XORR,TOR,OVER,TOR 318 000BDE ............* DW ABBS,TOR,DABS,RFROM,UMSLASHMOD - 4e-core430G2553 - Page 86 319 000BE8 ............* DW SWAP,RFROM,QNEGATE,SWAP,RFROM,QNEGATE 320 000BF4 .... DW EXIT 321 000BF6 322 000BF6 ;C d1 n1 -- n2 n3 floored signed div'n 323 000BF6 ; courtesy of Ed Smeda 324 000BF6 ; DUP >R SM/REM 2DUP 1 < AND IF 325 000BF6 ; SWAP R@ + SWAP 1- THEN 326 000BF6 ; R> DROP ; 327 000BF6 ; Ref. dpANS-6 section 3.2.2.1. 328 000BF6 ; HEADER FMSLASHMOD,6,'FM/MOD',DOCOLON 329 000BF6 ; DW DUP,TOR,SMSLASHREM 330 000BF6 ; DW TWODUP,lit,1,LESS,ANDD,qbran 331 000BF6 ; DEST FMMOD1 332 000BF6 ; DW SWAP,RFETCH,PLUS,SWAP,ONEMINUS 333 000BF6 ;FMMOD1: DW RFROM,DROP,EXIT 334 000BF6 335 000BF6 ; Fixed FM/MOD, added 12 nov 2012 336 000BF6 ;C FM/MOD d1 n1 -- n2 n3 floored signed div'n 337 000BF6 ; Ching-Tang Tseng Mar 24 2012 338 000BF6 ; DUP >R OVER OVER XOR >R 339 000BF6 ; SM/REM 340 000BF6 ; OVER R> 0< AND 341 000BF6 ; IF SWAP R@ + SWAP 1 - 342 000BF6 ; THEN R> DROP ; 343 000BF6 ; 1 0 2 FM/MOD(OK) . . 0 1 ok 344 000BF6 ; 7 0 9 FM/MOD(OK) . . 0 7 ok 345 000BF6 ; Ref. dpANS-6 section 3.2.2.1. 346 000BF6 HEADER FMSLASHMOD,6,'FM/MOD',DOCOLON 346.1 000000 PUBLIC FMSLASHMOD 346.2 000BF6 .... DW link 346.3 000BF8 FF DB 0FFh ; not immediate 346.4 000BF9 link SET $ 346.5 000BF9 06 DB 6 346.6 000BFA 464D2F4D4F44 DB 'FM/MOD' 346.7 000C00 EVEN 346.8 000C00 IF 'DOCOLON'='DOCODE' 346.9 000C00 FMSLASHMOD: DW $+2 346.10 000C00 ELSE 346.11 000C00 .... FMSLASHMOD: DW DOCOLON 346.12 000C02 ENDIF 346.13 000C02 ENDM 347 000C02 ............* DW DUP,TOR,OVER,OVER,XORR,TOR 348 000C0E .... DW SMSLASHREM 349 000C10 ............* DW OVER,RFROM,ZEROLESS,ANDD,qbran 350 000C1A DEST FMMOD1 350.1 000C1A 0C00 DW FMMOD1-$ 350.2 000C1C ENDM 351 000C1C ............* DW SWAP,RFETCH,PLUS,SWAP,ONEMINUS 352 000C26 ............ FMMOD1: DW RFROM,DROP,EXIT 353 000C2C 354 000C2C ;C * n1 n2 -- n3 signed multiply 355 000C2C ; M* DROP ; 356 000C2C HEADER STAR,1,'*',DOCOLON 356.1 000000 PUBLIC STAR 356.2 000C2C .... DW link 356.3 000C2E FF DB 0FFh ; not immediate 356.4 000C2F link SET $ 356.5 000C2F 01 DB 1 356.6 000C30 2A DB '*' 356.7 000C31 00 EVEN 356.8 000C32 IF 'DOCOLON'='DOCODE' 356.9 000C32 STAR: DW $+2 356.10 000C32 ELSE 356.11 000C32 .... STAR: DW DOCOLON 356.12 000C34 ENDIF 356.13 000C34 ENDM 357 000C34 ............ DW MSTAR,DROP,EXIT 358 000C3A 359 000C3A ;C /MOD n1 n2 -- n3 n4 signed divide/rem'dr 360 000C3A ; >R S>D R> FM/MOD ; 361 000C3A HEADER SLASHMOD,4,'/MOD',DOCOLON 361.1 000000 PUBLIC SLASHMOD 361.2 000C3A .... DW link 361.3 000C3C FF DB 0FFh ; not immediate 361.4 000C3D link SET $ - 4e-core430G2553 - Page 87 361.5 000C3D 04 DB 4 361.6 000C3E 2F4D4F44 DB '/MOD' 361.7 000C42 EVEN 361.8 000C42 IF 'DOCOLON'='DOCODE' 361.9 000C42 SLASHMOD: DW $+2 361.10 000C42 ELSE 361.11 000C42 .... SLASHMOD: DW DOCOLON 361.12 000C44 ENDIF 361.13 000C44 ENDM 362 000C44 ............* DW TOR,STOD,RFROM,FMSLASHMOD,EXIT 363 000C4E 364 000C4E ;C / n1 n2 -- n3 signed divide 365 000C4E ; /MOD nip ; 366 000C4E HEADER SLASH,1,'/',DOCOLON 366.1 000000 PUBLIC SLASH 366.2 000C4E .... DW link 366.3 000C50 FF DB 0FFh ; not immediate 366.4 000C51 link SET $ 366.5 000C51 01 DB 1 366.6 000C52 2F DB '/' 366.7 000C53 00 EVEN 366.8 000C54 IF 'DOCOLON'='DOCODE' 366.9 000C54 SLASH: DW $+2 366.10 000C54 ELSE 366.11 000C54 .... SLASH: DW DOCOLON 366.12 000C56 ENDIF 366.13 000C56 ENDM 367 000C56 ............ DW SLASHMOD,NIP,EXIT 368 000C5C 369 000C5C ;C MOD n1 n2 -- n3 signed remainder 370 000C5C ; /MOD DROP ; 371 000C5C HEADER MODD,3,'MOD',DOCOLON 371.1 000000 PUBLIC MODD 371.2 000C5C .... DW link 371.3 000C5E FF DB 0FFh ; not immediate 371.4 000C5F link SET $ 371.5 000C5F 03 DB 3 371.6 000C60 4D4F44 DB 'MOD' 371.7 000C63 00 EVEN 371.8 000C64 IF 'DOCOLON'='DOCODE' 371.9 000C64 MODD: DW $+2 371.10 000C64 ELSE 371.11 000C64 .... MODD: DW DOCOLON 371.12 000C66 ENDIF 371.13 000C66 ENDM 372 000C66 ............ DW SLASHMOD,DROP,EXIT 373 000C6C 374 000C6C ;C */MOD n1 n2 n3 -- n4 n5 n1*n2/n3, rem" 375 000C6C ; >R M* R> FM/MOD ; 376 000C6C HEADER SSMOD,5,'*/MOD',DOCOLON 376.1 000000 PUBLIC SSMOD 376.2 000C6C .... DW link 376.3 000C6E FF DB 0FFh ; not immediate 376.4 000C6F link SET $ 376.5 000C6F 05 DB 5 376.6 000C70 2A2F4D4F44 DB '*/MOD' 376.7 000C75 00 EVEN 376.8 000C76 IF 'DOCOLON'='DOCODE' 376.9 000C76 SSMOD: DW $+2 376.10 000C76 ELSE 376.11 000C76 .... SSMOD: DW DOCOLON 376.12 000C78 ENDIF 376.13 000C78 ENDM 377 000C78 ............* DW TOR,MSTAR,RFROM,FMSLASHMOD,EXIT 378 000C82 379 000C82 ;C */ n1 n2 n3 -- n4 n1*n2/n3 380 000C82 ; */MOD nip ; 381 000C82 HEADER STARSLASH,2,'*/',DOCOLON 381.1 000000 PUBLIC STARSLASH 381.2 000C82 .... DW link 381.3 000C84 FF DB 0FFh ; not immediate 381.4 000C85 link SET $ 381.5 000C85 02 DB 2 381.6 000C86 2A2F DB '*/' 381.7 000C88 EVEN 381.8 000C88 IF 'DOCOLON'='DOCODE' 381.9 000C88 STARSLASH: DW $+2 - 4e-core430G2553 - Page 88 381.10 000C88 ELSE 381.11 000C88 .... STARSLASH: DW DOCOLON 381.12 000C8A ENDIF 381.13 000C8A ENDM 382 000C8A ............ DW SSMOD,NIP,EXIT 383 000C90 384 000C90 ;C MAX n1 n2 -- n3 signed maximum 385 000C90 ; 2DUP < IF SWAP THEN DROP ; 386 000C90 HEADER MAX,3,'MAX',DOCOLON 386.1 000000 PUBLIC MAX 386.2 000C90 .... DW link 386.3 000C92 FF DB 0FFh ; not immediate 386.4 000C93 link SET $ 386.5 000C93 03 DB 3 386.6 000C94 4D4158 DB 'MAX' 386.7 000C97 00 EVEN 386.8 000C98 IF 'DOCOLON'='DOCODE' 386.9 000C98 MAX: DW $+2 386.10 000C98 ELSE 386.11 000C98 .... MAX: DW DOCOLON 386.12 000C9A ENDIF 386.13 000C9A ENDM 387 000C9A ............ DW TWODUP,LESS,qbran 388 000CA0 DEST MAX1 388.1 000CA0 0400 DW MAX1-$ 388.2 000CA2 ENDM 389 000CA2 .... DW SWAP 390 000CA4 ........ MAX1: DW DROP,EXIT 391 000CA8 392 000CA8 ;C MIN n1 n2 -- n3 signed minimum 393 000CA8 ; 2DUP > IF SWAP THEN DROP ; 394 000CA8 HEADER MIN,3,'MIN',DOCOLON 394.1 000000 PUBLIC MIN 394.2 000CA8 .... DW link 394.3 000CAA FF DB 0FFh ; not immediate 394.4 000CAB link SET $ 394.5 000CAB 03 DB 3 394.6 000CAC 4D494E DB 'MIN' 394.7 000CAF 00 EVEN 394.8 000CB0 IF 'DOCOLON'='DOCODE' 394.9 000CB0 MIN: DW $+2 394.10 000CB0 ELSE 394.11 000CB0 .... MIN: DW DOCOLON 394.12 000CB2 ENDIF 394.13 000CB2 ENDM 395 000CB2 ............ DW TWODUP,GREATER,qbran 396 000CB8 DEST MIN1 396.1 000CB8 0400 DW MIN1-$ 396.2 000CBA ENDM 397 000CBA .... DW SWAP 398 000CBC ........ MIN1: DW DROP,EXIT 399 000CC0 400 000CC0 ; DOUBLE OPERATORS ============================= = 401 000CC0 402 000CC0 ;C 2@ a-addr -- x1 x2 fetch 2 cells 403 000CC0 ; DUP CELL+ @ SWAP @ ; 404 000CC0 ; the lower address will appear on top of stack 405 000CC0 HEADER TWOFETCH,2,'2@',DOCOLON 405.1 000000 PUBLIC TWOFETCH 405.2 000CC0 .... DW link 405.3 000CC2 FF DB 0FFh ; not immediate 405.4 000CC3 link SET $ 405.5 000CC3 02 DB 2 405.6 000CC4 3240 DB '2@' 405.7 000CC6 EVEN 405.8 000CC6 IF 'DOCOLON'='DOCODE' 405.9 000CC6 TWOFETCH: DW $+2 405.10 000CC6 ELSE 405.11 000CC6 .... TWOFETCH: DW DOCOLON 405.12 000CC8 ENDIF 405.13 000CC8 ENDM 406 000CC8 ............* DW DUP,CELLPLUS,FETCH,SWAP,FETCH,EXIT 407 000CD4 408 000CD4 ;C 2! x1 x2 a-addr -- store 2 cells 409 000CD4 ; SWAP OVER ! CELL+ ! ; 410 000CD4 ; the top of stack is stored at the lower - 4e-core430G2553 - Page 89 adrs 411 000CD4 HEADER TWOSTORE,2,'2!',DOCOLON 411.1 000000 PUBLIC TWOSTORE 411.2 000CD4 .... DW link 411.3 000CD6 FF DB 0FFh ; not immediate 411.4 000CD7 link SET $ 411.5 000CD7 02 DB 2 411.6 000CD8 3221 DB '2!' 411.7 000CDA EVEN 411.8 000CDA IF 'DOCOLON'='DOCODE' 411.9 000CDA TWOSTORE: DW $+2 411.10 000CDA ELSE 411.11 000CDA .... TWOSTORE: DW DOCOLON 411.12 000CDC ENDIF 411.13 000CDC ENDM 412 000CDC ............* DW SWAP,OVER,STORE,CELLPLUS,STORE,EXIT 413 000CE8 414 000CE8 ;C 2DROP x1 x2 -- drop 2 cells 415 000CE8 ; DROP DROP ; 416 000CE8 HEADER TWODROP,5,'2DROP',DOCOLON 416.1 000000 PUBLIC TWODROP 416.2 000CE8 .... DW link 416.3 000CEA FF DB 0FFh ; not immediate 416.4 000CEB link SET $ 416.5 000CEB 05 DB 5 416.6 000CEC 3244524F50 DB '2DROP' 416.7 000CF1 00 EVEN 416.8 000CF2 IF 'DOCOLON'='DOCODE' 416.9 000CF2 TWODROP: DW $+2 416.10 000CF2 ELSE 416.11 000CF2 .... TWODROP: DW DOCOLON 416.12 000CF4 ENDIF 416.13 000CF4 ENDM 417 000CF4 ............ DW DROP,DROP,EXIT 418 000CFA 419 000CFA ;C 2DUP x1 x2 -- x1 x2 x1 x2 dup top 2 cells 420 000CFA ; OVER OVER ; 421 000CFA HEADER TWODUP,4,'2DUP',DOCOLON 421.1 000000 PUBLIC TWODUP 421.2 000CFA .... DW link 421.3 000CFC FF DB 0FFh ; not immediate 421.4 000CFD link SET $ 421.5 000CFD 04 DB 4 421.6 000CFE 32445550 DB '2DUP' 421.7 000D02 EVEN 421.8 000D02 IF 'DOCOLON'='DOCODE' 421.9 000D02 TWODUP: DW $+2 421.10 000D02 ELSE 421.11 000D02 .... TWODUP: DW DOCOLON 421.12 000D04 ENDIF 421.13 000D04 ENDM 422 000D04 ............ DW OVER,OVER,EXIT 423 000D0A 424 000D0A ;C 2SWAP x1 x2 x3 x4 -- x3 x4 x1 x2 per diagram 425 000D0A ; ROT >R ROT R> ; 426 000D0A HEADER TWOSWAP,5,'2SWAP',DOCOLON 426.1 000000 PUBLIC TWOSWAP 426.2 000D0A .... DW link 426.3 000D0C FF DB 0FFh ; not immediate 426.4 000D0D link SET $ 426.5 000D0D 05 DB 5 426.6 000D0E 3253574150 DB '2SWAP' 426.7 000D13 00 EVEN 426.8 000D14 IF 'DOCOLON'='DOCODE' 426.9 000D14 TWOSWAP: DW $+2 426.10 000D14 ELSE 426.11 000D14 .... TWOSWAP: DW DOCOLON 426.12 000D16 ENDIF 426.13 000D16 ENDM 427 000D16 ............* DW ROT,TOR,ROT,RFROM,EXIT 428 000D20 429 000D20 ;C 2OVER x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 430 000D20 ; >R >R 2DUP R> R> 2SWAP ; 431 000D20 HEADER TWOOVER,5,'2OVER',DOCOLON 431.1 000000 PUBLIC TWOOVER - 4e-core430G2553 - Page 90 431.2 000D20 .... DW link 431.3 000D22 FF DB 0FFh ; not immediate 431.4 000D23 link SET $ 431.5 000D23 05 DB 5 431.6 000D24 324F564552 DB '2OVER' 431.7 000D29 00 EVEN 431.8 000D2A IF 'DOCOLON'='DOCODE' 431.9 000D2A TWOOVER: DW $+2 431.10 000D2A ELSE 431.11 000D2A .... TWOOVER: DW DOCOLON 431.12 000D2C ENDIF 431.13 000D2C ENDM 432 000D2C ............* DW TOR,TOR,TWODUP,RFROM,RFROM 433 000D36 ........ DW TWOSWAP,EXIT 434 000D3A 435 000D3A ; INPUT/OUTPUT ================================= = 436 000D3A 437 000000 PUBLIC DOCR 438 000D3A 439 000D3A ;C COUNT c-addr1 -- c-addr2 u counted->adr/le n 440 000D3A ; DUP CHAR+ SWAP C@ ; 441 000D3A HEADER COUNT,5,'COUNT',DOCOLON 441.1 000000 PUBLIC COUNT 441.2 000D3A .... DW link 441.3 000D3C FF DB 0FFh ; not immediate 441.4 000D3D link SET $ 441.5 000D3D 05 DB 5 441.6 000D3E 434F554E54 DB 'COUNT' 441.7 000D43 00 EVEN 441.8 000D44 IF 'DOCOLON'='DOCODE' 441.9 000D44 COUNT: DW $+2 441.10 000D44 ELSE 441.11 000D44 .... COUNT: DW DOCOLON 441.12 000D46 ENDIF 441.13 000D46 ENDM 442 000D46 ............* DW DUP,CHARPLUS,SWAP,CFETCH,EXIT 443 000D50 444 000D50 ;C DOCR -- output newline 445 000D50 ; 0D EMIT 0A EMIT ; 446 000D50 HEADER DOCR,4,'DOCR',DOCOLON 446.1 000D50 PUBLIC DOCR 446.2 000D50 .... DW link 446.3 000D52 FF DB 0FFh ; not immediate 446.4 000D53 link SET $ 446.5 000D53 04 DB 4 446.6 000D54 444F4352 DB 'DOCR' 446.7 000D58 EVEN 446.8 000D58 IF 'DOCOLON'='DOCODE' 446.9 000D58 DOCR: DW $+2 446.10 000D58 ELSE 446.11 000D58 .... DOCR: DW DOCOLON 446.12 000D5A ENDIF 446.13 000D5A ENDM 447 000D5A ....0D00....* DW lit,0dh,EMIT,lit,0ah,EMIT,EXIT 448 000D68 449 000D68 ;C CR -- output newline 450 000D68 ; userkey @ execute ; 451 000D68 HEADER CR,2,'CR',DOCOLON 451.1 000000 PUBLIC CR 451.2 000D68 .... DW link 451.3 000D6A FF DB 0FFh ; not immediate 451.4 000D6B link SET $ 451.5 000D6B 02 DB 2 451.6 000D6C 4352 DB 'CR' 451.7 000D6E EVEN 451.8 000D6E IF 'DOCOLON'='DOCODE' 451.9 000D6E CR: DW $+2 451.10 000D6E ELSE 451.11 000D6E .... CR: DW DOCOLON 451.12 000D70 ENDIF 451.13 000D70 ENDM 452 000D70 ............* DW NEWLINE,FETCH,EXECUTE,EXIT 453 000D78 454 000D78 ;C SPACE -- output a space 455 000D78 ; BL EMIT ; - 4e-core430G2553 - Page 91 456 000D78 HEADER SPACE,5,'SPACE',DOCOLON 456.1 000000 PUBLIC SPACE 456.2 000D78 .... DW link 456.3 000D7A FF DB 0FFh ; not immediate 456.4 000D7B link SET $ 456.5 000D7B 05 DB 5 456.6 000D7C 5350414345 DB 'SPACE' 456.7 000D81 00 EVEN 456.8 000D82 IF 'DOCOLON'='DOCODE' 456.9 000D82 SPACE: DW $+2 456.10 000D82 ELSE 456.11 000D82 .... SPACE: DW DOCOLON 456.12 000D84 ENDIF 456.13 000D84 ENDM 457 000D84 ............ DW BLANK,EMIT,EXIT 458 000D8A 459 000D8A ;C SPACES n -- output n spaces 460 000D8A ; BEGIN DUP WHILE SPACE 1- REPEAT DROP ; 461 000D8A HEADER SPACES,6,'SPACES',DOCOLON 461.1 000000 PUBLIC SPACES 461.2 000D8A .... DW link 461.3 000D8C FF DB 0FFh ; not immediate 461.4 000D8D link SET $ 461.5 000D8D 06 DB 6 461.6 000D8E 535041434553 DB 'SPACES' 461.7 000D94 EVEN 461.8 000D94 IF 'DOCOLON'='DOCODE' 461.9 000D94 SPACES: DW $+2 461.10 000D94 ELSE 461.11 000D94 .... SPACES: DW DOCOLON 461.12 000D96 ENDIF 461.13 000D96 ENDM 462 000D96 ........ SPCS1: DW DUP,qbran 463 000D9A DEST SPCS2 463.1 000D9A 0A00 DW SPCS2-$ 463.2 000D9C ENDM 464 000D9C ............ DW SPACE,ONEMINUS,bran 465 000DA2 DEST SPCS1 465.1 000DA2 F4FF DW SPCS1-$ 465.2 000DA4 ENDM 466 000DA4 ........ SPCS2: DW DROP,EXIT 467 000DA8 468 000DA8 ;Z umin u1 u2 -- u unsigned minimum 469 000DA8 ; 2DUP U> IF SWAP THEN DROP ; 470 000DA8 HEADER UMIN,4,'UMIN',DOCOLON 470.1 000000 PUBLIC UMIN 470.2 000DA8 .... DW link 470.3 000DAA FF DB 0FFh ; not immediate 470.4 000DAB link SET $ 470.5 000DAB 04 DB 4 470.6 000DAC 554D494E DB 'UMIN' 470.7 000DB0 EVEN 470.8 000DB0 IF 'DOCOLON'='DOCODE' 470.9 000DB0 UMIN: DW $+2 470.10 000DB0 ELSE 470.11 000DB0 .... UMIN: DW DOCOLON 470.12 000DB2 ENDIF 470.13 000DB2 ENDM 471 000DB2 ............ DW TWODUP,UGREATER,qbran 472 000DB8 DEST UMIN1 472.1 000DB8 0400 DW UMIN1-$ 472.2 000DBA ENDM 473 000DBA .... DW SWAP 474 000DBC ........ UMIN1: DW DROP,EXIT 475 000DC0 476 000DC0 ;Z umax u1 u2 -- u unsigned maximum 477 000DC0 ; 2DUP U< IF SWAP THEN DROP ; 478 000DC0 HEADER UMAX,4,'UMAX',DOCOLON 478.1 000000 PUBLIC UMAX 478.2 000DC0 .... DW link 478.3 000DC2 FF DB 0FFh ; not immediate 478.4 000DC3 link SET $ 478.5 000DC3 04 DB 4 478.6 000DC4 554D4158 DB 'UMAX' 478.7 000DC8 EVEN 478.8 000DC8 IF 'DOCOLON'='DOCODE' 478.9 000DC8 UMAX: DW $+2 - 4e-core430G2553 - Page 92 478.10 000DC8 ELSE 478.11 000DC8 .... UMAX: DW DOCOLON 478.12 000DCA ENDIF 478.13 000DCA ENDM 479 000DCA ............ DW TWODUP,ULESS,qbran 480 000DD0 DEST UMAX1 480.1 000DD0 0400 DW UMAX1-$ 480.2 000DD2 ENDM 481 000DD2 .... DW SWAP 482 000DD4 ........ UMAX1: DW DROP,EXIT 483 000DD8 484 000DD8 ; C .ERR# n -- print error number 485 000DD8 HEADER DOTERRN,5,'.ERR#',DOCOLON 485.1 000000 PUBLIC DOTERRN 485.2 000DD8 .... DW link 485.3 000DDA FF DB 0FFh ; not immediate 485.4 000DDB link SET $ 485.5 000DDB 05 DB 5 485.6 000DDC 2E45525223 DB '.ERR#' 485.7 000DE1 00 EVEN 485.8 000DE2 IF 'DOCOLON'='DOCODE' 485.9 000DE2 DOTERRN: DW $+2 485.10 000DE2 ELSE 485.11 000DE2 .... DOTERRN: DW DOCOLON 485.12 000DE4 ENDIF 485.13 000DE4 ENDM 486 000DE4 ....1500.... DW lit,15H,EMIT ; emit a NAK ($15) 487 000DEA ....3F00.... DW lit,3FH,EMIT 488 000DF0 ............* DW BASE,FETCH,TOR,DECIMAL 489 000DF8 .... DW DOT 490 000DFA ............ DW RFROM,BASE,STORE 491 000E00 .... DW EXIT 492 000E02 493 000E02 ; C ?TIB adr1 adr2 -- error if line too long 494 000E02 HEADERLESS QTIB,4,'?TIB',DOCOLON 494.1 000000 PUBLIC QTIB 494.2 000E02 IF 'DOCOLON'='DOCODE' 494.3 000E02 QTIB: DW $+2 494.4 000E02 ELSE 494.5 000E02 .... QTIB: DW DOCOLON 494.6 000E04 ENDIF 494.7 000E04 ENDM 495 000E04 ........ DW GREATER,qbran 496 000E08 DEST QTIB1 496.1 000E08 0C00 DW QTIB1-$ 496.2 000E0A ENDM 497 000E0A ....9601.... DW lit,406,DOTERRN 498 000E10 ........ DW CR,ABORT 499 000E14 .... QTIB1: DW EXIT 500 000E16 501 000E16 ;C ACCEPT c-addr +n -- +n' get line from term'l 502 000E16 ; OVER + 1- OVER -- sa ea a 503 000E16 ; BEGIN KEY -- sa ea a c 504 000E16 ; DUP 0D <> WHILE 505 000E16 ; DUP EMIT -- sa ea a c 506 000E16 ; DUP 8 = IF DROP 1- >R OVER R> UMAX 507 000E16 ; ELSE OVER C! 1+ OVER UMIN 508 000E16 ; THEN -- sa ea a 509 000E16 ; REPEAT -- sa ea a c 510 000E16 ; DROP NIP SWAP - ; 511 000E16 HEADER ACCEPT,6,'ACCEPT',DOCOLON 511.1 000000 PUBLIC ACCEPT 511.2 000E16 .... DW link 511.3 000E18 FF DB 0FFh ; not immediate 511.4 000E19 link SET $ 511.5 000E19 06 DB 6 511.6 000E1A 414343455054 DB 'ACCEPT' 511.7 000E20 EVEN 511.8 000E20 IF 'DOCOLON'='DOCODE' 511.9 000E20 ACCEPT: DW $+2 511.10 000E20 ELSE 511.11 000E20 .... ACCEPT: DW DOCOLON 511.12 000E22 ENDIF 511.13 000E22 ENDM - 4e-core430G2553 - Page 93 512 000E22 ............* DW OVER,PLUS,ONEMINUS,OVER 513 000E2A ACC1: ; DW KEY,DUP,lit,0DH,NOTEQUAL,qbran 514 000E2A .... DW KEY 515 000E2C ........0D00* DW DUP,lit,0DH,NOTEQUAL ; ( -- c f ) CR 516 000E34 ; DW OVER,lit,0AH,NOTEQUAL ; ( -- c f f ) LF 517 000E34 ; DW ANDD 518 000E34 .... DW qbran 519 000E36 DEST ACC5 519.1 000E36 3A00 DW ACC5-$ 519.2 000E38 ENDM 520 000E38 ........ DW DUP,EMIT 521 000E3C ; DW DUP,STORELEDS ; testing 522 000E3C ........0800* DW DUP,lit,8,EQUAL,qbran ;mk BS received? 523 000E46 DEST ACC3 523.1 000E46 1A00 DW ACC3-$ 523.2 000E48 ENDM 524 000E48 ............* DW DROP,ONEMINUS,TOR,OVER,RFROM,UMAX ;mk backspace handling 525 000E54 ........0800* DW SPACE,lit,8,EMIT ;mk $08 == BS (for tera term and hyterterminal) 526 000E5C .... DW bran 527 000E5E DEST ACC4 527.1 000E5E 0E00 DW ACC4-$ 527.2 000E60 ENDM 528 000E60 ; ( -- sa ea a c ) 529 000E60 ............ ACC3: DW OVER,CSTORE,ONEPLUS 530 000E66 ; ( -- sa ea a+1 ) 531 000E66 ; DW OVER,UMIN ; einfacher zähler stillstand 532 000E66 ............ DW TWODUP,SWAP,QTIB ; line too long? 533 000E6C .... ACC4: DW bran 534 000E6E DEST ACC1 534.1 000E6E BCFF DW ACC1-$ 534.2 000E70 ENDM 535 000E70 ............*ACC5: DW DROP,NIP,SWAP,MINUS,EXIT 536 000E7A 537 000E7A ;C TYPE c-addr +n -- type line to term'l 538 000E7A ; ?DUP IF 539 000E7A ; OVER + SWAP DO I C@ EMIT LOOP 540 000E7A ; ELSE DROP THEN ; 541 000E7A HEADER TYP,4,'TYPE',DOCOLON 541.1 000000 PUBLIC TYP 541.2 000E7A .... DW link 541.3 000E7C FF DB 0FFh ; not immediate 541.4 000E7D link SET $ 541.5 000E7D 04 DB 4 541.6 000E7E 54595045 DB 'TYPE' 541.7 000E82 EVEN 541.8 000E82 IF 'DOCOLON'='DOCODE' 541.9 000E82 TYP: DW $+2 541.10 000E82 ELSE 541.11 000E82 .... TYP: DW DOCOLON 541.12 000E84 ENDIF 541.13 000E84 ENDM 542 000E84 ........ DW QDUP,qbran 543 000E88 DEST TYP4 543.1 000E88 1800 DW TYP4-$ 543.2 000E8A ENDM 544 000E8A ............* DW OVER,PLUS,SWAP,xdo 545 000E92 ............*TYP3: DW II,CFETCH,EMIT,xloop 546 000E9A DEST TYP3 546.1 000E9A F8FF DW TYP3-$ 546.2 000E9C ENDM 547 000E9C .... DW bran 548 000E9E DEST TYP5 548.1 000E9E 0400 DW TYP5-$ 548.2 000EA0 ENDM 549 000EA0 .... TYP4: DW DROP 550 000EA2 .... TYP5: DW EXIT 551 000EA4 552 000EA4 #define ITYPE TYP 553 000EA4 #define ICOUNT COUNT - 4e-core430G2553 - Page 94 554 000EA4 555 000EA4 ; HARVARD MODEL EXTENSIONS (split Code & Data) 556 000EA4 557 000EA4 /* 558 000EA4 ;Z ICOUNT c-addr1 -- c-addr2 u counted->adr/le n 559 000EA4 ; DUP CHAR+ SWAP IC@ ; from Code space 560 000EA4 HEADER ICOUNT,6,'ICOUNT',DOCOLON 561 000EA4 DW DUP,CHARPLUS,SWAP,ICFETCH,EXIT 562 000EA4 563 000EA4 ;Z ITYPE c-addr +n -- type line to term'l 564 000EA4 ; ?DUP IF from Code space 565 000EA4 ; OVER + SWAP DO I IC@ EMIT LOOP 566 000EA4 ; ELSE DROP THEN ; 567 000EA4 HEADER ITYPE,5,'ITYPE',DOCOLON 568 000EA4 DW QDUP,qbran 569 000EA4 DEST ITYP4 570 000EA4 DW OVER,PLUS,SWAP,xdo 571 000EA4 ITYP3: DW II,ICFETCH,EMIT,xloop 572 000EA4 DEST ITYP3 573 000EA4 DW bran 574 000EA4 DEST ITYP5 575 000EA4 ITYP4: DW DROP 576 000EA4 ITYP5: DW EXIT 577 000EA4 */ 578 000EA4 579 000EA4 580 000EA4 ;Z (IS") -- c-addr u run-time code for S" 581 000EA4 ; R> ICOUNT 2DUP + ALIGNED >R ; 582 000EA4 ; Harvard model, for string stored in Code space 583 000EA4 ; e.g. as used by ." 584 000EA4 HEADER XISQUOTE,5,'(IS")',DOCOLON 584.1 000000 PUBLIC XISQUOTE 584.2 000EA4 .... DW link 584.3 000EA6 FF DB 0FFh ; not immediate 584.4 000EA7 link SET $ 584.5 000EA7 05 DB 5 584.6 000EA8 2849532229 DB '(IS")' 584.7 000EAD 00 EVEN 584.8 000EAE IF 'DOCOLON'='DOCODE' 584.9 000EAE XISQUOTE: DW $+2 584.10 000EAE ELSE 584.11 000EAE .... XISQUOTE: DW DOCOLON 584.12 000EB0 ENDIF 584.13 000EB0 ENDM 585 000EB0 ............* DW RFROM,ICOUNT,TWODUP,PLUS,ALIGNED,TOR 586 000EBC .... DW EXIT 587 000EBE 588 000EBE ;Z (S") -- c-addr u run-time code for S" 589 000EBE ; R@ I@ get Data address 590 000EBE ; R> CELL+ DUP IC@ CHAR+ -- Dadr Radr+2 n+1 591 000EBE ; 2DUP + ALIGNED >R -- Dadr Iadr n+1 592 000EBE ; >R OVER R> I->D -- Dadr 593 000EBE ; COUNT ; 594 000EBE ; Harvard model, for string stored in Code space 595 000EBE ; which is copied to Data space. 596 000EBE HEADER XSQUOTE,4,'(S")',DOCOLON 596.1 000000 PUBLIC XSQUOTE 596.2 000EBE .... DW link 596.3 000EC0 FF DB 0FFh ; not immediate 596.4 000EC1 link SET $ 596.5 000EC1 04 DB 4 596.6 000EC2 28532229 DB '(S")' 596.7 000EC6 EVEN 596.8 000EC6 IF 'DOCOLON'='DOCODE' 596.9 000EC6 XSQUOTE: DW $+2 596.10 000EC6 ELSE - 4e-core430G2553 - Page 95 596.11 000EC6 .... XSQUOTE: DW DOCOLON 596.12 000EC8 ENDIF 596.13 000EC8 ENDM 597 000EC8 ........ DW RFETCH,IFETCH 598 000ECC ............* DW RFROM,CELLPLUS,DUP,ICFETCH,CHARPLUS 599 000ED6 ............* DW TWODUP,PLUS,ALIGNED,TOR 600 000EDE ............* DW TOR,OVER,RFROM,ITOD,COUNT,EXIT 601 000EEA 602 000EEA ;Z IS" -- compile in-line string 603 000EEA ; COMPILE (IS") [ HEX ] 604 000EEA ; 22 PARSE ( -- c-addr n ) 605 000EEA ; DUP >R IC, IHERE R@ D->I 606 000EEA ; R> IALLOT ALIGN ; IMMEDIATE 607 000EEA ; Harvard model: string is stored in Code space 608 000EEA IMMED ISQUOTE,3,'IS"',DOCOLON 608.1 000000 PUBLIC ISQUOTE 608.2 000EEA .... DW link 608.3 000EEC FE DB 0FEh // ; immediate (LSB=0) 608.4 000EED link SET $ 608.5 000EED 03 DB 3 608.6 000EEE 495322 DB 'IS"' 608.7 000EF1 00 EVEN 608.8 000EF2 IF 'DOCOLON'='DOCODE' 608.9 000EF2 ISQUOTE: DW $+2 608.10 000EF2 ELSE 608.11 000EF2 .... ISQUOTE: DW DOCOLON 608.12 000EF4 ENDIF 608.13 000EF4 ENDM 609 000EF4 ............ DW lit,XISQUOTE,COMMAXT 610 000EFA ....2200.... DW lit,22H,PARSE 611 000F00 ............* DW DUP,TOR,ICCOMMA,IHERE,RFETCH,DTOI 612 000F0C ............* DW RFROM,IALLOT,ALIGNN,EXIT 613 000F14 614 000F14 ;Z IS" -- compile in-line string OLD DEF'N 615 000F14 ; COMPILE (IS") [ HEX ] 616 000F14 ; 22 IWORD 617 000F14 ; IC@ 1+ ALIGNED IALLOT ; IMMEDIATE 618 000F14 ; Harvard model: string is stored in Code space 619 000F14 ; IMMED ISQUOTE,3,'IS"',DOCOLON 620 000F14 ; DW lit,XISQUOTE,COMMAXT 621 000F14 ; DW lit,22H,IWORD 622 000F14 ; DW ICFETCH,ONEPLUS,ALIGNED,IALLOT,EXIT 623 000F14 624 000F14 ;C S" -- compile in-line string 625 000F14 ; COMPILE (S") [ HEX ] 626 000F14 ; HERE I, data address 627 000F14 ; 22 PARSE ( -- c-addr n ) 628 000F14 ; DUP >R IC, IHERE R@ D->I 629 000F14 ; R@ 1+ ALLOT reserve RAM space 630 000F14 ; R> IALLOT ALIGN ; IMMEDIATE 631 000F14 ; Harvard model: string is stored in Code space 632 000F14 IMMED SQUOTE,2,'S"',DOCOLON 632.1 000000 PUBLIC SQUOTE 632.2 000F14 .... DW link 632.3 000F16 FE DB 0FEh // ; immediate (LSB=0) 632.4 000F17 link SET $ 632.5 000F17 02 DB 2 632.6 000F18 5322 DB 'S"' 632.7 000F1A EVEN 632.8 000F1A IF 'DOCOLON'='DOCODE' 632.9 000F1A SQUOTE: DW $+2 632.10 000F1A ELSE 632.11 000F1A .... SQUOTE: DW DOCOLON 632.12 000F1C ENDIF 632.13 000F1C ENDM 633 000F1C ............ DW lit,XSQUOTE,COMMAXT 634 000F22 ............* DW HERE,ICOMMA,lit,22H,PARSE 635 000F2C ............* DW DUP,TOR,ICCOMMA,IHERE,RFETCH,DTOI 636 000F38 ............ DW RFETCH,ONEPLUS,ALLOT - 4e-core430G2553 - Page 96 637 000F3E ............* DW RFROM,IALLOT,ALIGNN,EXIT 638 000F46 639 000F46 ;C S" -- compile in-line string OLD DEF'N 640 000F46 ; COMPILE (S") [ HEX ] 641 000F46 ; HERE I, data address 642 000F46 ; 22 IWORD 643 000F46 ; IC@ 1+ ALIGNED 644 000F46 ; DUP ALLOT IALLOT ; IMMEDIATE 645 000F46 ; Harvard model: string is stored in Code space 646 000F46 ; IMMED SQUOTE,2,'S"',DOCOLON 647 000F46 ; DW lit,XSQUOTE,COMMAXT 648 000F46 ; DW HERE,ICOMMA,lit,22H,IWORD 649 000F46 ; DW ICFETCH,ONEPLUS,ALIGNED 650 000F46 ; DW DUP,ALLOT,IALLOT,EXIT 651 000F46 652 000F46 ;C ." -- compile string to print 653 000F46 ; POSTPONE IS" POSTPONE ITYPE ; IMMEDIATE 654 000F46 IMMED DOTQUOTE,2,'."',DOCOLON 654.1 000000 PUBLIC DOTQUOTE 654.2 000F46 .... DW link 654.3 000F48 FE DB 0FEh // ; immediate (LSB=0) 654.4 000F49 link SET $ 654.5 000F49 02 DB 2 654.6 000F4A 2E22 DB '."' 654.7 000F4C EVEN 654.8 000F4C IF 'DOCOLON'='DOCODE' 654.9 000F4C DOTQUOTE: DW $+2 654.10 000F4C ELSE 654.11 000F4C .... DOTQUOTE: DW DOCOLON 654.12 000F4E ENDIF 654.13 000F4E ENDM 655 000F4E .... DW ISQUOTE 656 000F50 ............ DW lit,ITYPE,COMMAXT 657 000F56 .... DW EXIT 658 000F58 659 000F58 ;Z IWORD c -- c-addr WORD to Code space 660 000F58 ; WORD 661 000F58 ; IHERE TUCK OVER C@ CHAR+ D->I ; 662 000F58 HEADER IWORD,5,'IWORD',DOCOLON 662.1 000000 PUBLIC IWORD 662.2 000F58 .... DW link 662.3 000F5A FF DB 0FFh ; not immediate 662.4 000F5B link SET $ 662.5 000F5B 05 DB 5 662.6 000F5C 49574F5244 DB 'IWORD' 662.7 000F61 00 EVEN 662.8 000F62 IF 'DOCOLON'='DOCODE' 662.9 000F62 IWORD: DW $+2 662.10 000F62 ELSE 662.11 000F62 .... IWORD: DW DOCOLON 662.12 000F64 ENDIF 662.13 000F64 ENDM 663 000F64 .... DW WORDD 664 000F66 ............*IWORD1: DW IHERE,TUCK,OVER,CFETCH 665 000F6E ............ DW CHARPLUS,DTOI,EXIT 666 000F74 667 000F74 ;Z IWORDC c -- c-addr maybe capitalize WORD to Code space 668 000F74 ; WORD CAPITALIZE 669 000F74 ; IHERE TUCK OVER C@ CHAR+ D->I ; 670 000F74 ; HEADER IWORDC,6,'IWORDC',DOCOLON 671 000F74 HEADLESS IWORDC, DOCOLON 671.1 000000 PUBLIC IWORDC 671.2 000F74 IF 'DOCOLON'='DOCODE' 671.3 000F74 IWORDC: DW $+2 671.4 000F74 ELSE 671.5 000F74 .... IWORDC: DW DOCOLON 671.6 000F76 ENDIF 671.7 000F76 ENDM 672 000F76 ........ DW WORDD, CAPITALIZE 673 000F7A .... DW bran 674 000F7C DEST IWORD1 674.1 000F7C EAFF DW IWORD1-$ - 4e-core430G2553 - Page 97 674.2 000F7E ENDM 675 000F7E 676 000F7E ; SEPARATE HEADER EXTENSIONS ARE NOT USED 677 000F7E #define HCOUNT ICOUNT 678 000F7E #define HTYPE ITYPE 679 000F7E #define HWORD IWORDC 680 000F7E 681 000F7E ; NUMERIC OUTPUT =============================== = 682 000F7E ; Numeric conversion is done l.s.digit first, so 683 000F7E ; the output buffer is built backwards in memory. 684 000F7E 685 000F7E ; Some double-precision arithmetic operators are 686 000F7E ; needed to implement ANSI numeric conversion. 687 000F7E 688 000F7E ;Z UD/MOD ud1 u2 -- u3 ud4 32/16->32 divide 689 000F7E ; >R 0 R@ UM/MOD ROT ROT R> UM/MOD ROT ; 690 000F7E HEADER UDSLASHMOD,6,'UD/MOD',DOCOLON 690.1 000000 PUBLIC UDSLASHMOD 690.2 000F7E .... DW link 690.3 000F80 FF DB 0FFh ; not immediate 690.4 000F81 link SET $ 690.5 000F81 06 DB 6 690.6 000F82 55442F4D4F44 DB 'UD/MOD' 690.7 000F88 EVEN 690.8 000F88 IF 'DOCOLON'='DOCODE' 690.9 000F88 UDSLASHMOD: DW $+2 690.10 000F88 ELSE 690.11 000F88 .... UDSLASHMOD: DW DOCOLON 690.12 000F8A ENDIF 690.13 000F8A ENDM 691 000F8A ............* DW TOR,ZERO,RFETCH,UMSLASHMOD,ROT,ROT 692 000F96 ............* DW RFROM,UMSLASHMOD,ROT,EXIT 693 000F9E 694 000F9E ;Z UD* ud1 d2 -- ud3 32*16->32 multiply 695 000F9E ; DUP >R UM* DROP SWAP R> UM* ROT + ; 696 000F9E HEADER UDSTAR,3,'UD*',DOCOLON 696.1 000000 PUBLIC UDSTAR 696.2 000F9E .... DW link 696.3 000FA0 FF DB 0FFh ; not immediate 696.4 000FA1 link SET $ 696.5 000FA1 03 DB 3 696.6 000FA2 55442A DB 'UD*' 696.7 000FA5 00 EVEN 696.8 000FA6 IF 'DOCOLON'='DOCODE' 696.9 000FA6 UDSTAR: DW $+2 696.10 000FA6 ELSE 696.11 000FA6 .... UDSTAR: DW DOCOLON 696.12 000FA8 ENDIF 696.13 000FA8 ENDM 697 000FA8 ............* DW DUP,TOR,UMSTAR,DROP 698 000FB0 ............* DW SWAP,RFROM,UMSTAR,ROT,PLUS,EXIT 699 000FBC 700 000FBC ;C HOLD char -- add char to output string 701 000FBC ; -1 HP +! HP @ C! ; 702 000FBC HEADER HOLD,4,'HOLD',DOCOLON 702.1 000000 PUBLIC HOLD 702.2 000FBC .... DW link 702.3 000FBE FF DB 0FFh ; not immediate 702.4 000FBF link SET $ 702.5 000FBF 04 DB 4 702.6 000FC0 484F4C44 DB 'HOLD' 702.7 000FC4 EVEN 702.8 000FC4 IF 'DOCOLON'='DOCODE' 702.9 000FC4 HOLD: DW $+2 702.10 000FC4 ELSE 702.11 000FC4 .... HOLD: DW DOCOLON 702.12 000FC6 ENDIF 702.13 000FC6 ENDM 703 000FC6 ....FFFF....* DW lit,-1,HP,PLUSSTORE - 4e-core430G2553 - Page 98 704 000FCE ............* DW HP,FETCH,CSTORE,EXIT 705 000FD6 706 000FD6 ;C <# -- begin numeric conversion 707 000FD6 ; PAD HP ! ; (initialize Hold Pointer) 708 000FD6 HEADER LESSNUM,2,'<#',DOCOLON 708.1 000000 PUBLIC LESSNUM 708.2 000FD6 .... DW link 708.3 000FD8 FF DB 0FFh ; not immediate 708.4 000FD9 link SET $ 708.5 000FD9 02 DB 2 708.6 000FDA 3C23 DB '<#' 708.7 000FDC EVEN 708.8 000FDC IF 'DOCOLON'='DOCODE' 708.9 000FDC LESSNUM: DW $+2 708.10 000FDC ELSE 708.11 000FDC .... LESSNUM: DW DOCOLON 708.12 000FDE ENDIF 708.13 000FDE ENDM 709 000FDE ............* DW PAD,HP,STORE,EXIT 710 000FE6 711 000FE6 ;Z >digit n -- c convert to 0..9A..Z 712 000FE6 ; [ HEX ] DUP 9 > 7 AND + 30 + ; 713 000FE6 HEADER TODIGIT,6,'>DIGIT',DOCOLON 713.1 000000 PUBLIC TODIGIT 713.2 000FE6 .... DW link 713.3 000FE8 FF DB 0FFh ; not immediate 713.4 000FE9 link SET $ 713.5 000FE9 06 DB 6 713.6 000FEA 3E4449474954 DB '>DIGIT' 713.7 000FF0 EVEN 713.8 000FF0 IF 'DOCOLON'='DOCODE' 713.9 000FF0 TODIGIT: DW $+2 713.10 000FF0 ELSE 713.11 000FF0 .... TODIGIT: DW DOCOLON 713.12 000FF2 ENDIF 713.13 000FF2 ENDM 714 000FF2 ........0900* DW DUP,lit,9,GREATER,lit,7,ANDD,PLUS 715 001002 ....3000....* DW lit,30H,PLUS,EXIT 716 00100A 717 00100A ;C # ud1 -- ud2 convert 1 digit of output 718 00100A ; BASE @ UD/MOD ROT >digit HOLD ; 719 00100A HEADER NUM,1,'#',DOCOLON 719.1 000000 PUBLIC NUM 719.2 00100A .... DW link 719.3 00100C FF DB 0FFh ; not immediate 719.4 00100D link SET $ 719.5 00100D 01 DB 1 719.6 00100E 23 DB '#' 719.7 00100F 00 EVEN 719.8 001010 IF 'DOCOLON'='DOCODE' 719.9 001010 NUM: DW $+2 719.10 001010 ELSE 719.11 001010 .... NUM: DW DOCOLON 719.12 001012 ENDIF 719.13 001012 ENDM 720 001012 ............* DW BASE,FETCH,UDSLASHMOD,ROT,TODIGIT 721 00101C ........ DW HOLD,EXIT 722 001020 723 001020 ;C #S ud1 -- ud2 convert remaining digits 724 001020 ; BEGIN # 2DUP OR 0= UNTIL ; 725 001020 HEADER NUMS,2,'#S',DOCOLON 725.1 000000 PUBLIC NUMS 725.2 001020 .... DW link 725.3 001022 FF DB 0FFh ; not immediate 725.4 001023 link SET $ 725.5 001023 02 DB 2 725.6 001024 2353 DB '#S' 725.7 001026 EVEN 725.8 001026 IF 'DOCOLON'='DOCODE' 725.9 001026 NUMS: DW $+2 725.10 001026 ELSE 725.11 001026 .... NUMS: DW DOCOLON 725.12 001028 ENDIF 725.13 001028 ENDM 726 001028 ............*NUMS1: DW NUM,TWODUP,ORR,ZEROEQUAL,qbran - 4e-core430G2553 - Page 99 727 001032 DEST NUMS1 727.1 001032 F6FF DW NUMS1-$ 727.2 001034 ENDM 728 001034 .... DW EXIT 729 001036 730 001036 ;C #> ud1 -- c-addr u end conv., get string 731 001036 ; 2DROP HP @ PAD OVER - ; 732 001036 HEADER NUMGREATER,2,'#>',DOCOLON 732.1 000000 PUBLIC NUMGREATER 732.2 001036 .... DW link 732.3 001038 FF DB 0FFh ; not immediate 732.4 001039 link SET $ 732.5 001039 02 DB 2 732.6 00103A 233E DB '#>' 732.7 00103C EVEN 732.8 00103C IF 'DOCOLON'='DOCODE' 732.9 00103C NUMGREATER: DW $+2 732.10 00103C ELSE 732.11 00103C .... NUMGREATER: DW DOCOLON 732.12 00103E ENDIF 732.13 00103E ENDM 733 00103E ............* DW TWODROP,HP,FETCH,PAD,OVER,MINUS,EXIT 734 00104C 735 00104C ;C SIGN n -- add minus sign if n<0 736 00104C ; 0< IF 2D HOLD THEN ; 737 00104C HEADER SIGN,4,'SIGN',DOCOLON 737.1 000000 PUBLIC SIGN 737.2 00104C .... DW link 737.3 00104E FF DB 0FFh ; not immediate 737.4 00104F link SET $ 737.5 00104F 04 DB 4 737.6 001050 5349474E DB 'SIGN' 737.7 001054 EVEN 737.8 001054 IF 'DOCOLON'='DOCODE' 737.9 001054 SIGN: DW $+2 737.10 001054 ELSE 737.11 001054 .... SIGN: DW DOCOLON 737.12 001056 ENDIF 737.13 001056 ENDM 738 001056 ........ DW ZEROLESS,qbran 739 00105A DEST SIGN1 739.1 00105A 0800 DW SIGN1-$ 739.2 00105C ENDM 740 00105C ....2D00.... DW lit,2DH,HOLD 741 001062 .... SIGN1: DW EXIT 742 001064 743 001064 ;C U. u -- display u unsigned 744 001064 ; <# 0 #S #> TYPE SPACE ; 745 001064 HEADER UDOT,2,'U.',DOCOLON 745.1 000000 PUBLIC UDOT 745.2 001064 .... DW link 745.3 001066 FF DB 0FFh ; not immediate 745.4 001067 link SET $ 745.5 001067 02 DB 2 745.6 001068 552E DB 'U.' 745.7 00106A EVEN 745.8 00106A IF 'DOCOLON'='DOCODE' 745.9 00106A UDOT: DW $+2 745.10 00106A ELSE 745.11 00106A .... UDOT: DW DOCOLON 745.12 00106C ENDIF 745.13 00106C ENDM 746 00106C ............* DW LESSNUM,ZERO,NUMS,NUMGREATER,TYP 747 001076 ........ DW SPACE,EXIT 748 00107A 749 00107A ;C . n -- display n signed 750 00107A ; <# DUP ABS 0 #S ROT SIGN #> TYPE SPACE ; 751 00107A HEADER DOT,1,'.',DOCOLON 751.1 000000 PUBLIC DOT 751.2 00107A .... DW link 751.3 00107C FF DB 0FFh ; not immediate 751.4 00107D link SET $ 751.5 00107D 01 DB 1 751.6 00107E 2E DB '.' 751.7 00107F 00 EVEN - 4e-core430G2553 - Page 100 751.8 001080 IF 'DOCOLON'='DOCODE' 751.9 001080 DOT: DW $+2 751.10 001080 ELSE 751.11 001080 .... DOT: DW DOCOLON 751.12 001082 ENDIF 751.13 001082 ENDM 752 001082 ............* DW LESSNUM,DUP,ABBS,ZERO,NUMS 753 00108C ............* DW ROT,SIGN,NUMGREATER,TYP,SPACE,EXIT 754 001098 755 001098 ;C DECIMAL -- set number base to decimal 756 001098 ; 10 BASE ! ; 757 001098 HEADER DECIMAL,7,'DECIMAL',DOCOLON 757.1 000000 PUBLIC DECIMAL 757.2 001098 .... DW link 757.3 00109A FF DB 0FFh ; not immediate 757.4 00109B link SET $ 757.5 00109B 07 DB 7 757.6 00109C 444543494D41* DB 'DECIMAL' 757.7 0010A3 00 EVEN 757.8 0010A4 IF 'DOCOLON'='DOCODE' 757.9 0010A4 DECIMAL: DW $+2 757.10 0010A4 ELSE 757.11 0010A4 .... DECIMAL: DW DOCOLON 757.12 0010A6 ENDIF 757.13 0010A6 ENDM 758 0010A6 ....0A00....* DW lit,10,BASE,STORE,EXIT 759 0010B0 760 0010B0 ;X HEX -- set number base to hex 761 0010B0 ; 16 BASE ! ; 762 0010B0 HEADER HEX,3,'HEX',DOCOLON 762.1 000000 PUBLIC HEX 762.2 0010B0 .... DW link 762.3 0010B2 FF DB 0FFh ; not immediate 762.4 0010B3 link SET $ 762.5 0010B3 03 DB 3 762.6 0010B4 484558 DB 'HEX' 762.7 0010B7 00 EVEN 762.8 0010B8 IF 'DOCOLON'='DOCODE' 762.9 0010B8 HEX: DW $+2 762.10 0010B8 ELSE 762.11 0010B8 .... HEX: DW DOCOLON 762.12 0010BA ENDIF 762.13 0010BA ENDM 763 0010BA ....1000....* DW lit,16,BASE,STORE,EXIT 764 0010C4 765 0010C4 ; DICTIONARY MANAGEMENT ======================== = 766 0010C4 767 0010C4 ;C HERE -- addr returns dictionary ptr 768 0010C4 ; DP @ ; 769 0010C4 HEADER HERE,4,'HERE',DOCOLON 769.1 000000 PUBLIC HERE 769.2 0010C4 .... DW link 769.3 0010C6 FF DB 0FFh ; not immediate 769.4 0010C7 link SET $ 769.5 0010C7 04 DB 4 769.6 0010C8 48455245 DB 'HERE' 769.7 0010CC EVEN 769.8 0010CC IF 'DOCOLON'='DOCODE' 769.9 0010CC HERE: DW $+2 769.10 0010CC ELSE 769.11 0010CC .... HERE: DW DOCOLON 769.12 0010CE ENDIF 769.13 0010CE ENDM 770 0010CE ............ DW DDP,FETCH,EXIT 771 0010D4 772 0010D4 ;C ALLOT n -- allocate n bytes in dict 773 0010D4 ; DP +! ; 774 0010D4 HEADER ALLOT,5,'ALLOT',DOCOLON 774.1 000000 PUBLIC ALLOT 774.2 0010D4 .... DW link 774.3 0010D6 FF DB 0FFh ; not immediate 774.4 0010D7 link SET $ 774.5 0010D7 05 DB 5 - 4e-core430G2553 - Page 101 774.6 0010D8 414C4C4F54 DB 'ALLOT' 774.7 0010DD 00 EVEN 774.8 0010DE IF 'DOCOLON'='DOCODE' 774.9 0010DE ALLOT: DW $+2 774.10 0010DE ELSE 774.11 0010DE .... ALLOT: DW DOCOLON 774.12 0010E0 ENDIF 774.13 0010E0 ENDM 775 0010E0 ............ DW DDP,PLUSSTORE,EXIT 776 0010E6 777 0010E6 ;C , x -- append cell to dict 778 0010E6 ; HERE ! 1 CELLS ALLOT ; 779 0010E6 HEADER COMMA,1,',',DOCOLON 779.1 000000 PUBLIC COMMA 779.2 0010E6 .... DW link 779.3 0010E8 FF DB 0FFh ; not immediate 779.4 0010E9 link SET $ 779.5 0010E9 01 DB 1 779.6 0010EA 2C DB ',' 779.7 0010EB 00 EVEN 779.8 0010EC IF 'DOCOLON'='DOCODE' 779.9 0010EC COMMA: DW $+2 779.10 0010EC ELSE 779.11 0010EC .... COMMA: DW DOCOLON 779.12 0010EE ENDIF 779.13 0010EE ENDM 780 0010EE ............* DW HERE,STORE,lit,1,CELLS,ALLOT,EXIT 781 0010FC 782 0010FC ;C C, char -- append char to dict 783 0010FC ; HERE C! 1 CHARS ALLOT ; 784 0010FC HEADER CCOMMA,2,'C,',DOCOLON 784.1 000000 PUBLIC CCOMMA 784.2 0010FC .... DW link 784.3 0010FE FF DB 0FFh ; not immediate 784.4 0010FF link SET $ 784.5 0010FF 02 DB 2 784.6 001100 432C DB 'C,' 784.7 001102 EVEN 784.8 001102 IF 'DOCOLON'='DOCODE' 784.9 001102 CCOMMA: DW $+2 784.10 001102 ELSE 784.11 001102 .... CCOMMA: DW DOCOLON 784.12 001104 ENDIF 784.13 001104 ENDM 785 001104 ............* DW HERE,CSTORE,lit,1,CHARS,ALLOT,EXIT 786 001112 787 001112 ; The following additional words support the 788 001112 ; "Harvard" model, with separate address spaces 789 001112 ; for Instructions (Code) and Data. ANSI 790 001112 ; requires DP to manage the Data space, so a 791 001112 ; separate Instruction Dictionary Pointer, IDP, 792 001112 ; is added to manage the Code space. Also added: 793 001112 ; I@ IC@ I! IC! I->D D->I (in the primitives ) 794 001112 ; ITYPE ICOUNT IWORD (above) 795 001112 ; IHERE IALLOT I, IC, (below) 796 001112 ; It should be possible to convert the Harvard 797 001112 ; implementation to a combined-code-and-data 798 001112 ; system, by equating these words to their 799 001112 ; Data-space counterparts. 800 001112 801 001112 ; on MSP430 we have Neumann, but 802 001112 ; I! IC! D->I (in the primitives) work on flash 803 001112 ; I@ IC@ alias @ C@ 804 001112 ; I->D alias CMOVE 805 001112 ; IWORD works on flash 806 001112 ; IHERE IALLOT I, IC, work on flash 807 001112 808 001112 ;C IHERE -- addr returns Code dictionary ptr 809 001112 ; IDP @ ; - 4e-core430G2553 - Page 102 810 001112 HEADER IHERE,5,'IHERE',DOCOLON 810.1 000000 PUBLIC IHERE 810.2 001112 .... DW link 810.3 001114 FF DB 0FFh ; not immediate 810.4 001115 link SET $ 810.5 001115 05 DB 5 810.6 001116 4948455245 DB 'IHERE' 810.7 00111B 00 EVEN 810.8 00111C IF 'DOCOLON'='DOCODE' 810.9 00111C IHERE: DW $+2 810.10 00111C ELSE 810.11 00111C .... IHERE: DW DOCOLON 810.12 00111E ENDIF 810.13 00111E ENDM 811 00111E ............ DW IDP,FETCH,EXIT 812 001124 813 001124 ;C IALLOT n -- allocate n bytes in Code dict 814 001124 ; IDP +! ; 815 001124 HEADER IALLOT,6,'IALLOT',DOCOLON 815.1 000000 PUBLIC IALLOT 815.2 001124 .... DW link 815.3 001126 FF DB 0FFh ; not immediate 815.4 001127 link SET $ 815.5 001127 06 DB 6 815.6 001128 49414C4C4F54 DB 'IALLOT' 815.7 00112E EVEN 815.8 00112E IF 'DOCOLON'='DOCODE' 815.9 00112E IALLOT: DW $+2 815.10 00112E ELSE 815.11 00112E .... IALLOT: DW DOCOLON 815.12 001130 ENDIF 815.13 001130 ENDM 816 001130 ............ DW IDP,PLUSSTORE,EXIT 817 001136 818 001136 ;C I, x -- append cell to Code dict 819 001136 ; IHERE I! 1 CELLS IALLOT ; 820 001136 HEADER ICOMMA,2,'I,',DOCOLON 820.1 000000 PUBLIC ICOMMA 820.2 001136 .... DW link 820.3 001138 FF DB 0FFh ; not immediate 820.4 001139 link SET $ 820.5 001139 02 DB 2 820.6 00113A 492C DB 'I,' 820.7 00113C EVEN 820.8 00113C IF 'DOCOLON'='DOCODE' 820.9 00113C ICOMMA: DW $+2 820.10 00113C ELSE 820.11 00113C .... ICOMMA: DW DOCOLON 820.12 00113E ENDIF 820.13 00113E ENDM 821 00113E ............* DW IHERE,ISTORE,lit,1,CELLS,IALLOT,EXIT 822 00114C 823 00114C ;C IC, char -- append char to Code dict 824 00114C ; IHERE IC! 1 CHARS IALLOT ; 825 00114C HEADER ICCOMMA,3,'IC,',DOCOLON 825.1 000000 PUBLIC ICCOMMA 825.2 00114C .... DW link 825.3 00114E FF DB 0FFh ; not immediate 825.4 00114F link SET $ 825.5 00114F 03 DB 3 825.6 001150 49432C DB 'IC,' 825.7 001153 00 EVEN 825.8 001154 IF 'DOCOLON'='DOCODE' 825.9 001154 ICCOMMA: DW $+2 825.10 001154 ELSE 825.11 001154 .... ICCOMMA: DW DOCOLON 825.12 001156 ENDIF 825.13 001156 ENDM 826 001156 ............* DW IHERE,ICSTORE,lit,1,CHARS,IALLOT,EXIT 827 001164 828 001164 ; SEPARATE HEADER EXTENSIONS ARE NOT USED 829 001164 #define HHERE IHERE 830 001164 #define HALLOT IALLOT 831 001164 #define HCOMMA ICOMMA 832 001164 #define HCCOMMA ICCOMMA - 4e-core430G2553 - Page 103 833 001164 #define HCFETCH ICFETCH 834 001164 #define HFETCH IFETCH 835 001164 #define HCSTORE ICSTORE 836 001164 #define HSTORE ISTORE 837 001164 838 001164 ; INTERPRETER ================================== = 839 001164 ; Note that NFA>LFA, NFA>CFA, IMMED?, and FIND 840 001164 ; are dependent on the structure of the Forth 841 001164 ; header. This may be common across many CPUs, 842 001164 ; or it may be different. 843 001164 844 001164 ; ?STACK -- 845 001164 ; depth 0< abort" SUF" ; stack underflow 846 001164 HEADER QSTACK,6,'?STACK',DOCOLON 846.1 000000 PUBLIC QSTACK 846.2 001164 .... DW link 846.3 001166 FF DB 0FFh ; not immediate 846.4 001167 link SET $ 846.5 001167 06 DB 6 846.6 001168 3F535441434B DB '?STACK' 846.7 00116E EVEN 846.8 00116E IF 'DOCOLON'='DOCODE' 846.9 00116E QSTACK: DW $+2 846.10 00116E ELSE 846.11 00116E .... QSTACK: DW DOCOLON 846.12 001170 ENDIF 846.13 001170 ENDM 847 001170 ............ DW DEPTH,ZEROLESS,XISQUOTE 848 001176 03535546 DB 3,'SUF' 849 00117A ........ DW QABORT,EXIT 850 00117E 851 00117E ;C SOURCE -- adr n current input buffer 852 00117E ; 'SOURCE 2@ ; length is at lower adrs 853 00117E HEADER SOURCE,6,'SOURCE',DOCOLON 853.1 000000 PUBLIC SOURCE 853.2 00117E .... DW link 853.3 001180 FF DB 0FFh ; not immediate 853.4 001181 link SET $ 853.5 001181 06 DB 6 853.6 001182 534F55524345 DB 'SOURCE' 853.7 001188 EVEN 853.8 001188 IF 'DOCOLON'='DOCODE' 853.9 001188 SOURCE: DW $+2 853.10 001188 ELSE 853.11 001188 .... SOURCE: DW DOCOLON 853.12 00118A ENDIF 853.13 00118A ENDM 854 00118A ............ DW TICKSOURCE,TWOFETCH,EXIT 855 001190 856 001190 ;X /STRING a u n -- a+n u-n trim string 857 001190 ; ROT OVER + ROT ROT - ; 858 001190 HEADER SLASHSTRING,7,'/STRING',DOCOLON 858.1 000000 PUBLIC SLASHSTRING 858.2 001190 .... DW link 858.3 001192 FF DB 0FFh ; not immediate 858.4 001193 link SET $ 858.5 001193 07 DB 7 858.6 001194 2F535452494E* DB '/STRING' 858.7 00119B 00 EVEN 858.8 00119C IF 'DOCOLON'='DOCODE' 858.9 00119C SLASHSTRING: DW $+2 858.10 00119C ELSE 858.11 00119C .... SLASHSTRING: DW DOCOLON 858.12 00119E ENDIF 858.13 00119E ENDM 859 00119E ............* DW ROT,OVER,PLUS,ROT,ROT,MINUS,EXIT 860 0011AC 861 0011AC ;Z >counted src n dst -- copy to counted str 862 0011AC ; 2DUP C! CHAR+ SWAP CMOVE ; 863 0011AC HEADER TOCOUNTED,8,'>COUNTED',DOCOLON 863.1 000000 PUBLIC TOCOUNTED 863.2 0011AC .... DW link - 4e-core430G2553 - Page 104 863.3 0011AE FF DB 0FFh ; not immediate 863.4 0011AF link SET $ 863.5 0011AF 08 DB 8 863.6 0011B0 3E434F554E54* DB '>COUNTED' 863.7 0011B8 EVEN 863.8 0011B8 IF 'DOCOLON'='DOCODE' 863.9 0011B8 TOCOUNTED: DW $+2 863.10 0011B8 ELSE 863.11 0011B8 .... TOCOUNTED: DW DOCOLON 863.12 0011BA ENDIF 863.13 0011BA ENDM 864 0011BA ............* DW TWODUP,CSTORE,CHARPLUS,SWAP,CMOVE,EXI T 865 0011C6 866 0011C6 ;Z ADR>IN c-addr' -- set >IN to offset to given adr 867 0011C6 ; SOURCE -- adr' adr n 868 0011C6 ; ROT ROT - -- n adr'-adr 869 0011C6 ; MIN 0 MAX -- n' 870 0011C6 ; >IN ! ; 871 0011C6 HEADER ADRTOIN,6,'ADR>IN',DOCOLON 871.1 000000 PUBLIC ADRTOIN 871.2 0011C6 .... DW link 871.3 0011C8 FF DB 0FFh ; not immediate 871.4 0011C9 link SET $ 871.5 0011C9 06 DB 6 871.6 0011CA 4144523E494E DB 'ADR>IN' 871.7 0011D0 EVEN 871.8 0011D0 IF 'DOCOLON'='DOCODE' 871.9 0011D0 ADRTOIN: DW $+2 871.10 0011D0 ELSE 871.11 0011D0 .... ADRTOIN: DW DOCOLON 871.12 0011D2 ENDIF 871.13 0011D2 ENDM 872 0011D2 ............* DW SOURCE,ROT,ROT,MINUS,MIN,lit,0,MAX 873 0011E2 ............ DW TOIN,STORE,EXIT 874 0011E8 875 0011E8 ;X PARSE char -- c-addr n word delim'd by char 876 0011E8 ; SOURCE >IN @ /STRING -- c adr n 877 0011E8 ; OVER >R save adr of string start 878 0011E8 ; ROT SCAN -- adr" n" 879 0011E8 ; OVER SWAP IF CHAR+ THEN skip trailing delim. if any 880 0011E8 ; ADR>IN advance >IN -- adr" 881 0011E8 ; R> TUCK - ; -- adr n' 882 0011E8 HEADER PARSE,5,'PARSE',DOCOLON 882.1 000000 PUBLIC PARSE 882.2 0011E8 .... DW link 882.3 0011EA FF DB 0FFh ; not immediate 882.4 0011EB link SET $ 882.5 0011EB 05 DB 5 882.6 0011EC 5041525345 DB 'PARSE' 882.7 0011F1 00 EVEN 882.8 0011F2 IF 'DOCOLON'='DOCODE' 882.9 0011F2 PARSE: DW $+2 882.10 0011F2 ELSE 882.11 0011F2 .... PARSE: DW DOCOLON 882.12 0011F4 ENDIF 882.13 0011F4 ENDM 883 0011F4 ............* DW SOURCE,TOIN,FETCH,SLASHSTRING 884 0011FC ............* DW OVER,TOR,ROT,SCAN 885 001204 ............ DW OVER,SWAP,qbran 886 00120A DEST PARSE1 886.1 00120A 0400 DW PARSE1-$ 886.2 00120C ENDM 887 00120C .... DW ONEPLUS ; char+ 888 00120E .... PARSE1: DW ADRTOIN 889 001210 ............* DW RFROM,TUCK,MINUS,EXIT 890 001218 891 001218 ;C WORD char -- c-addr word delim'd by char 892 001218 ; DUP SOURCE >IN @ /STRING -- c c adr - 4e-core430G2553 - Page 105 n 893 001218 ; ROT SKIP -- c adr' n' 894 001218 ; DROP ADR>IN PARSE -- adr" n" 895 001218 ; HERE >counted -- 896 001218 ; HERE -- a 897 001218 ; BL OVER COUNT + C! ; append trailing blank 898 001218 HEADER WORDD,4,'WORD',DOCOLON 898.1 000000 PUBLIC WORDD 898.2 001218 .... DW link 898.3 00121A FF DB 0FFh ; not immediate 898.4 00121B link SET $ 898.5 00121B 04 DB 4 898.6 00121C 574F5244 DB 'WORD' 898.7 001220 EVEN 898.8 001220 IF 'DOCOLON'='DOCODE' 898.9 001220 WORDD: DW $+2 898.10 001220 ELSE 898.11 001220 .... WORDD: DW DOCOLON 898.12 001222 ENDIF 898.13 001222 ENDM 899 001222 ............* DW DUP,SOURCE,TOIN,FETCH,SLASHSTRING 900 00122C ........ DW ROT,SKIP 901 001230 ............ DW DROP,ADRTOIN,PARSE 902 001236 ............ DW HERE,TOCOUNTED,HERE 903 00123C ............* DW BLANK,OVER,COUNT,PLUS,CSTORE,EXIT 904 001248 905 001248 ;C WORD char -- c-addr word delim'd by char OLD DEF'N 906 001248 ; DUP SOURCE >IN @ /STRING -- c c adr n 907 001248 ; DUP >R ROT SKIP -- c adr' n' 908 001248 ; OVER >R ROT SCAN -- adr" n" 909 001248 ; DUP IF CHAR- THEN skip trailing delim. 910 001248 ; R> R> ROT - >IN +! update >IN offset 911 001248 ; TUCK - -- adr' N 912 001248 ; HERE >counted -- 913 001248 ; HERE -- a 914 001248 ; BL OVER COUNT + C! ; append trailing blank 915 001248 ; HEADER WORDD,4,'WORD',DOCOLON 916 001248 ; DW DUP,SOURCE,TOIN,FETCH,SLASHSTRING 917 001248 ; DW DUP,TOR,ROT,SKIP 918 001248 ; DW OVER,TOR,ROT,SCAN 919 001248 ; DW DUP,qbran 920 001248 ; DEST WORD1 921 001248 ; DW ONEMINUS ; char- 922 001248 ;WORD1: DW RFROM,RFROM,ROT,MINUS,TOIN,PLUSSTORE 923 001248 ; DW TUCK,MINUS 924 001248 ; DW HERE,TOCOUNTED,HERE 925 001248 ; DW BLANK,OVER,COUNT,PLUS,CSTORE,EXIT 926 001248 927 001248 ;Z NFA>LFA nfa -- lfa name adr -> link field 928 001248 ; 3 - ; 929 001248 HEADER NFATOLFA,7,'NFA>LFA',DOCOLON 929.1 000000 PUBLIC NFATOLFA 929.2 001248 .... DW link 929.3 00124A FF DB 0FFh ; not immediate 929.4 00124B link SET $ 929.5 00124B 07 DB 7 929.6 00124C 4E46413E4C46* DB 'NFA>LFA' 929.7 001253 00 EVEN 929.8 001254 IF 'DOCOLON'='DOCODE' 929.9 001254 NFATOLFA: DW $+2 929.10 001254 ELSE 929.11 001254 .... NFATOLFA: DW DOCOLON 929.12 001256 ENDIF 929.13 001256 ENDM 930 001256 ....0300....* DW lit,3,MINUS,EXIT 931 00125E - 4e-core430G2553 - Page 106 932 00125E ;Z NFA>CFA nfa -- cfa name adr -> code field 933 00125E ; HCOUNT 7F AND + ALIGNED ; mask off 'smudge' bit 934 00125E HEADER NFATOCFA,7,'NFA>CFA',DOCOLON 934.1 000000 PUBLIC NFATOCFA 934.2 00125E .... DW link 934.3 001260 FF DB 0FFh ; not immediate 934.4 001261 link SET $ 934.5 001261 07 DB 7 934.6 001262 4E46413E4346* DB 'NFA>CFA' 934.7 001269 00 EVEN 934.8 00126A IF 'DOCOLON'='DOCODE' 934.9 00126A NFATOCFA: DW $+2 934.10 00126A ELSE 934.11 00126A .... NFATOCFA: DW DOCOLON 934.12 00126C ENDIF 934.13 00126C ENDM 935 00126C .... DW HCOUNT 936 00126E ....7F00....* DW lit,07FH,ANDD,PLUS,ALIGNED,EXIT 937 00127A 938 00127A ;Z IMMED? nfa -- f fetch immediate flag 939 00127A ; 1- HC@ 1 AND 0= ; Flashable model, LSB=0 if immed 940 00127A HEADER IMMEDQ,6,'IMMED?',DOCOLON 940.1 000000 PUBLIC IMMEDQ 940.2 00127A .... DW link 940.3 00127C FF DB 0FFh ; not immediate 940.4 00127D link SET $ 940.5 00127D 06 DB 6 940.6 00127E 494D4D45443F DB 'IMMED?' 940.7 001284 EVEN 940.8 001284 IF 'DOCOLON'='DOCODE' 940.9 001284 IMMEDQ: DW $+2 940.10 001284 ELSE 940.11 001284 .... IMMEDQ: DW DOCOLON 940.12 001286 ENDIF 940.13 001286 ENDM 941 001286 ............* DW ONEMINUS,HCFETCH,lit,1,ANDD,ZEROEQUAL ,EXIT 942 001294 943 001294 ;C FIND c-addr -- c-addr 0 if not found 944 001294 ;C FIND c-addr -- xt 1 if immediate 945 001294 ;C FIND c-addr -- xt -1 if "normal" 946 001294 ; LATEST @ BEGIN -- a nfa 947 001294 ; 2DUP OVER C@ CHAR+ -- a nfa a nfa n+1 948 001294 ; N= -- a nfa f 949 001294 ; DUP IF 950 001294 ; DROP 951 001294 ; NFA>LFA H@ DUP -- a link link 952 001294 ; THEN 953 001294 ; 0= UNTIL -- a nfa OR a 0 954 001294 ; DUP IF 955 001294 ; NIP DUP NFA>CFA -- nfa xt 956 001294 ; SWAP IMMED? -- xt iflag 957 001294 ; 0= 1 OR -- xt 1/-1 958 001294 ; THEN ; 959 001294 HEADER FIND,4,'FIND',DOCOLON 959.1 000000 PUBLIC FIND 959.2 001294 .... DW link 959.3 001296 FF DB 0FFh ; not immediate 959.4 001297 link SET $ 959.5 001297 04 DB 4 959.6 001298 46494E44 DB 'FIND' 959.7 00129C EVEN 959.8 00129C IF 'DOCOLON'='DOCODE' 959.9 00129C FIND: DW $+2 959.10 00129C ELSE 959.11 00129C .... FIND: DW DOCOLON 959.12 00129E ENDIF 959.13 00129E ENDM 960 00129E ........ DW LATEST,FETCH 961 0012A2 ............*FIND1: DW TWODUP,OVER,CFETCH,CHARPLUS - 4e-core430G2553 - Page 107 962 0012AA ............ DW NEQUAL,DUP,qbran 963 0012B0 DEST FIND2 963.1 0012B0 0A00 DW FIND2-$ 963.2 0012B2 ENDM 964 0012B2 ............* DW DROP,NFATOLFA,HFETCH,DUP 965 0012BA ........ FIND2: DW ZEROEQUAL,qbran 966 0012BE DEST FIND1 966.1 0012BE E4FF DW FIND1-$ 966.2 0012C0 ENDM 967 0012C0 ........ DW DUP,qbran 968 0012C4 DEST FIND3 968.1 0012C4 1400 DW FIND3-$ 968.2 0012C6 ENDM 969 0012C6 ............ DW NIP,DUP,NFATOCFA 970 0012CC ............* DW SWAP,IMMEDQ,ZEROEQUAL,lit,1,ORR 971 0012D8 .... FIND3: DW EXIT 972 0012DA 973 0012DA ;C UPC char -- char capitalize character 974 0012DA ; 975 0012DA ; DUP [CHAR] a < OVER [CHAR] z > OR IF EXIT THEN 976 0012DA ; [ CHAR A CHAR a - ] LITERAL + ; 977 0012DA ; HEADER UPC,3,'UPC',DOCOLON 978 0012DA HEADLESS UPC, DOCOLON 978.1 000000 PUBLIC UPC 978.2 0012DA IF 'DOCOLON'='DOCODE' 978.3 0012DA UPC: DW $+2 978.4 0012DA ELSE 978.5 0012DA .... UPC: DW DOCOLON 978.6 0012DC ENDIF 978.7 0012DC ENDM 979 0012DC ........6100* DW DUP, lit, 'a', LESS, OVER, lit, 'z', GREATER 980 0012EC ........ DW ORR, qbran 981 0012F0 DEST UPC1 981.1 0012F0 0400 DW UPC1-$ 981.2 0012F2 ENDM 982 0012F2 .... DW EXIT 983 0012F4 ....E0FF.... UPC1: DW lit, 'A'-'a', PLUS 984 0012FA .... DW EXIT 985 0012FC 986 0012FC ;C CAPITALIZE c-addr -- c-addr capitalize string 987 0012FC ; 988 0012FC ; CAPS @ IF DUP COUNT OVER + SWAP ?DO I c@ upc I c! LOOP THEN 989 0012FC ; HEADER CAPITALIZE, 10, 'CAPITALIZE', DOCOLON 990 0012FC HEADLESS CAPITALIZE, DOCOLON 990.1 000000 PUBLIC CAPITALIZE 990.2 0012FC IF 'DOCOLON'='DOCODE' 990.3 0012FC CAPITALIZE: DW $+2 990.4 0012FC ELSE 990.5 0012FC .... CAPITALIZE: DW DOCOLON 990.6 0012FE ENDIF 990.7 0012FE ENDM 991 0012FE ............ DW CAPS, FETCH, qbran 992 001304 DEST CAPS2 992.1 001304 1C00 DW CAPS2-$ 992.2 001306 ENDM 993 001306 ............* DW DUP, COUNT, OVER, PLUS, SWAP, xdo 994 001312 ............*CAPS1: DW II, CFETCH, UPC, II, CSTORE 995 00131C .... DW xloop 996 00131E DEST CAPS1 996.1 00131E F4FF DW CAPS1-$ 996.2 001320 ENDM 997 001320 .... CAPS2: DW EXIT 998 001322 999 001322 ;C LITERAL x -- append numeric literal 1000 001322 ; STATE @ IF ['] LIT ,XT I, THEN ; IMMEDIATE 1001 001322 ; This tests STATE so that it can also be used 1002 001322 ; interpretively. (ANSI doesn't require this.) 1003 001322 IMMED LITERAL,7,'LITERAL',DOCOLON 1003.1 000000 PUBLIC LITERAL - 4e-core430G2553 - Page 108 1003.2 001322 .... DW link 1003.3 001324 FE DB 0FEh // ; immediate (LSB=0) 1003.4 001325 link SET $ 1003.5 001325 07 DB 7 1003.6 001326 4C4954455241* DB 'LITERAL' 1003.7 00132D 00 EVEN 1003.8 00132E IF 'DOCOLON'='DOCODE' 1003.9 00132E LITERAL: DW $+2 1003.10 00132E ELSE 1003.11 00132E .... LITERAL: DW DOCOLON 1003.12 001330 ENDIF 1003.13 001330 ENDM 1004 001330 ............ DW STATE,FETCH,qbran 1005 001336 DEST LITER1 1005.1 001336 0A00 DW LITER1-$ 1005.2 001338 ENDM 1006 001338 ............* DW lit,lit,COMMAXT,ICOMMA 1007 001340 .... LITER1: DW EXIT 1008 001342 1009 001342 ;Z DIGIT? c -- n -1 if c is a valid digit 1010 001342 ;Z DIGIT? c -- x 0 otherwise 1011 001342 ; [ HEX ] DUP 39 > 100 AND + silly looking 1012 001342 ; DUP 140 > 107 AND - 30 - but it works! 1013 001342 ; DUP BASE @ U< ; 1014 001342 HEADER DIGITQ,6,'DIGIT?',DOCOLON 1014.1 000000 PUBLIC DIGITQ 1014.2 001342 .... DW link 1014.3 001344 FF DB 0FFh ; not immediate 1014.4 001345 link SET $ 1014.5 001345 06 DB 6 1014.6 001346 44494749543F DB 'DIGIT?' 1014.7 00134C EVEN 1014.8 00134C IF 'DOCOLON'='DOCODE' 1014.9 00134C DIGITQ: DW $+2 1014.10 00134C ELSE 1014.11 00134C .... DIGITQ: DW DOCOLON 1014.12 00134E ENDIF 1014.13 00134E ENDM 1015 00134E ........3900* DW DUP,lit,39H,GREATER,lit,100H,ANDD,PLU S 1016 00135E ........4001* DW DUP,lit,140H,GREATER,lit,107H,ANDD 1017 00136C ........3000* DW MINUS,lit,30H,MINUS 1018 001374 ............* DW DUP,BASE,FETCH,ULESS,EXIT 1019 00137E 1020 00137E ;Z ?SIGN adr n -- adr' n' f get optional sign 1021 00137E ;Z advance adr/n if sign; return NZ if negative 1022 00137E ; OVER C@ -- adr n c 1023 00137E ; 2C - DUP ABS 1 = AND -- +=-1, -=+1, else 0 1024 00137E ; DUP IF 1+ -- +=0, -=+2 1025 00137E ; >R 1 /STRING R> -- adr' n' f 1026 00137E ; THEN ; 1027 00137E HEADER QSIGN,5,'?SIGN',DOCOLON 1027.1 000000 PUBLIC QSIGN 1027.2 00137E .... DW link 1027.3 001380 FF DB 0FFh ; not immediate 1027.4 001381 link SET $ 1027.5 001381 05 DB 5 1027.6 001382 3F5349474E DB '?SIGN' 1027.7 001387 00 EVEN 1027.8 001388 IF 'DOCOLON'='DOCODE' 1027.9 001388 QSIGN: DW $+2 1027.10 001388 ELSE 1027.11 001388 .... QSIGN: DW DOCOLON 1027.12 00138A ENDIF 1027.13 00138A ENDM 1028 00138A ............* DW OVER,CFETCH,lit,2CH,MINUS,DUP,ABBS 1029 001398 ....0100....* DW lit,1,EQUAL,ANDD,DUP,qbran 1030 0013A4 DEST QSIGN1 1030.1 0013A4 0E00 DW QSIGN1-$ 1030.2 0013A6 ENDM - 4e-core430G2553 - Page 109 1031 0013A6 ............* DW ONEPLUS,TOR,lit,1,SLASHSTRING,RFROM 1032 0013B2 .... QSIGN1: DW EXIT 1033 0013B4 1034 0013B4 ;C >NUMBER ud adr u -- ud' adr' u' 1035 0013B4 ;C convert string to number 1036 0013B4 ; BEGIN 1037 0013B4 ; DUP WHILE 1038 0013B4 ; OVER C@ DIGIT? 1039 0013B4 ; 0= IF DROP EXIT THEN 1040 0013B4 ; >R 2SWAP BASE @ UD* 1041 0013B4 ; R> M+ 2SWAP 1042 0013B4 ; 1 /STRING 1043 0013B4 ; REPEAT ; 1044 0013B4 HEADER TONUMBER,7,'>NUMBER',DOCOLON 1044.1 000000 PUBLIC TONUMBER 1044.2 0013B4 .... DW link 1044.3 0013B6 FF DB 0FFh ; not immediate 1044.4 0013B7 link SET $ 1044.5 0013B7 07 DB 7 1044.6 0013B8 3E4E554D4245* DB '>NUMBER' 1044.7 0013BF 00 EVEN 1044.8 0013C0 IF 'DOCOLON'='DOCODE' 1044.9 0013C0 TONUMBER: DW $+2 1044.10 0013C0 ELSE 1044.11 0013C0 .... TONUMBER: DW DOCOLON 1044.12 0013C2 ENDIF 1044.13 0013C2 ENDM 1045 0013C2 ........ TONUM1: DW DUP,qbran 1046 0013C6 DEST TONUM3 1046.1 0013C6 2C00 DW TONUM3-$ 1046.2 0013C8 ENDM 1047 0013C8 ............ DW OVER,CFETCH,DIGITQ 1048 0013CE ........ DW ZEROEQUAL,qbran 1049 0013D2 DEST TONUM2 1049.1 0013D2 0600 DW TONUM2-$ 1049.2 0013D4 ENDM 1050 0013D4 ........ DW DROP,EXIT 1051 0013D8 ............*TONUM2: DW TOR,TWOSWAP,BASE,FETCH,UDSTAR 1052 0013E2 ............ DW RFROM,MPLUS,TWOSWAP 1053 0013E8 ....0100....* DW lit,1,SLASHSTRING,bran 1054 0013F0 DEST TONUM1 1054.1 0013F0 D2FF DW TONUM1-$ 1054.2 0013F2 ENDM 1055 0013F2 .... TONUM3: DW EXIT 1056 0013F4 1057 0013F4 ;Z ?NUMBER c-addr -- n -1 string->number 1058 0013F4 ;Z ?NUMBER c-addr -- c-addr 0 if convert error 1059 0013F4 ; DUP 0 0 ROT COUNT -- ca ud adr n 1060 0013F4 ; ?SIGN >R >NUMBER -- ca ud adr' n' 1061 0013F4 ; IF R> 2DROP 2DROP 0 -- ca 0 (error) 1062 0013F4 ; ELSE 2DROP NIP R> 1063 0013F4 ; IF NEGATE THEN -1 -- n -1 (ok) 1064 0013F4 ; THEN ; 1065 0013F4 HEADER QNUMBER,7,'?NUMBER',DOCOLON 1065.1 000000 PUBLIC QNUMBER 1065.2 0013F4 .... DW link 1065.3 0013F6 FF DB 0FFh ; not immediate 1065.4 0013F7 link SET $ 1065.5 0013F7 07 DB 7 1065.6 0013F8 3F4E554D4245* DB '?NUMBER' 1065.7 0013FF 00 EVEN 1065.8 001400 IF 'DOCOLON'='DOCODE' 1065.9 001400 QNUMBER: DW $+2 1065.10 001400 ELSE 1065.11 001400 .... QNUMBER: DW DOCOLON 1065.12 001402 ENDIF 1065.13 001402 ENDM 1066 001402 ............* DW DUP,ZERO,DUP,ROT,COUNT 1067 00140C ............* DW QSIGN,TOR,TONUMBER,qbran 1068 001414 DEST QNUM1 1068.1 001414 1000 DW QNUM1-$ 1068.2 001416 ENDM 1069 001416 ............* DW RFROM,TWODROP,TWODROP,lit,0 1070 001420 .... DW bran - 4e-core430G2553 - Page 110 1071 001422 DEST QNUM3 1071.1 001422 1200 DW QNUM3-$ 1071.2 001424 ENDM 1072 001424 ............*QNUM1: DW TWODROP,NIP,RFROM,qbran 1073 00142C DEST QNUM2 1073.1 00142C 0400 DW QNUM2-$ 1073.2 00142E ENDM 1074 00142E .... DW NEGATE 1075 001430 ....FFFF QNUM2: DW lit,-1 1076 001434 .... QNUM3: DW EXIT 1077 001436 1078 001436 ;Z INTERPRET i*x c-addr u -- j*x interpret given buffer 1079 001436 ; This is a common factor of EVALUATE and QUIT. 1080 001436 ; ref. dpANS-6, 3.4 The Forth Text Interpreter 1081 001436 ; 'SOURCE 2! 0 >IN ! 1082 001436 ; BEGIN 1083 001436 ; BL WORD DUP C@ WHILE -- textadr 1084 001436 ; CAPITALIZE 1085 001436 ; FIND -- a 0/1/-1 1086 001436 ; ?DUP IF -- xt 1/-1 1087 001436 ; 1+ STATE @ 0= OR IMMED or interp? 1088 001436 ; IF EXECUTE ELSE ,XT THEN 1089 001436 ; ELSE -- textadr 1090 001436 ; ?NUMBER 1091 001436 ; IF POSTPONE LITERAL converted ok 1092 001436 ; ELSE COUNT TYPE 3F EMIT CR ABORT err 1093 001436 ; THEN 1094 001436 ; THEN 1095 001436 ; REPEAT DROP ; 1096 001436 HEADER INTERPRET,9,'INTERPRET',DOCOLON 1096.1 000000 PUBLIC INTERPRET 1096.2 001436 .... DW link 1096.3 001438 FF DB 0FFh ; not immediate 1096.4 001439 link SET $ 1096.5 001439 09 DB 9 1096.6 00143A 494E54455250* DB 'INTERPRET' 1096.7 001443 00 EVEN 1096.8 001444 IF 'DOCOLON'='DOCODE' 1096.9 001444 INTERPRET: DW $+2 1096.10 001444 ELSE 1096.11 001444 .... INTERPRET: DW DOCOLON 1096.12 001446 ENDIF 1096.13 001446 ENDM 1097 001446 ............* DW TICKSOURCE,TWOSTORE,ZERO,TOIN,STORE 1098 001450 .... INTER1: DW QSTACK ; ?stack prüft auf stck underflow mk 1099 001452 ............* DW BLANK,WORDD,DUP,CFETCH,qbran 1100 00145C DEST INTER9 1100.1 00145C 4A00 DW INTER9-$ 1100.2 00145E ENDM 1101 00145E .... DW CAPITALIZE 1102 001460 ............ DW FIND,QDUP,qbran 1103 001466 DEST INTER4 1103.1 001466 1C00 DW INTER4-$ 1103.2 001468 ENDM 1104 001468 ............* DW ONEPLUS,STATE,FETCH,ZEROEQUAL,ORR 1105 001472 .... DW qbran 1106 001474 DEST INTER2 1106.1 001474 0800 DW INTER2-$ 1106.2 001476 ENDM 1107 001476 ........ DW EXECUTE,bran 1108 00147A DEST INTER3 1108.1 00147A 0400 DW INTER3-$ 1108.2 00147C ENDM 1109 00147C .... INTER2: DW COMMAXT 1110 00147E .... INTER3: DW bran 1111 001480 DEST INTER8 1111.1 001480 2200 DW INTER8-$ 1111.2 001482 ENDM 1112 001482 ........ INTER4: DW QNUMBER,qbran 1113 001486 DEST INTER5 1113.1 001486 0800 DW INTER5-$ 1113.2 001488 ENDM - 4e-core430G2553 - Page 111 1114 001488 ........ DW LITERAL,bran 1115 00148C DEST INTER6 1115.1 00148C 1600 DW INTER6-$ 1115.2 00148E ENDM 1116 00148E ........ INTER5: DW COUNT,TYP 1117 001492 ....1500.... DW lit,15H,EMIT ; emit a NAK ($15) 1118 001498 ....3F00.... DW lit,3FH,EMIT 1119 00149E ; DW TOIN,FETCH,DOT 1120 00149E ........ DW CR,ABORT 1121 0014A2 INTER6: 1122 0014A2 .... INTER8: DW bran 1123 0014A4 DEST INTER1 1123.1 0014A4 ACFF DW INTER1-$ 1123.2 0014A6 ENDM 1124 0014A6 ........ INTER9: DW DROP,EXIT 1125 0014AA 1126 0014AA ;C EVALUATE i*x c-addr u -- j*x interprt string 1127 0014AA ; 'SOURCE 2@ >R >R >IN @ >R 1128 0014AA ; INTERPRET 1129 0014AA ; R> >IN ! R> R> 'SOURCE 2! ; 1130 0014AA HEADER EVALUATE,8,'EVALUATE',DOCOLON 1130.1 000000 PUBLIC EVALUATE 1130.2 0014AA .... DW link 1130.3 0014AC FF DB 0FFh ; not immediate 1130.4 0014AD link SET $ 1130.5 0014AD 08 DB 8 1130.6 0014AE 4556414C5541* DB 'EVALUATE' 1130.7 0014B6 EVEN 1130.8 0014B6 IF 'DOCOLON'='DOCODE' 1130.9 0014B6 EVALUATE: DW $+2 1130.10 0014B6 ELSE 1130.11 0014B6 .... EVALUATE: DW DOCOLON 1130.12 0014B8 ENDIF 1130.13 0014B8 ENDM 1131 0014B8 ............* DW TICKSOURCE,TWOFETCH,TOR,TOR 1132 0014C0 ............* DW TOIN,FETCH,TOR,INTERPRET 1133 0014C8 ............* DW RFROM,TOIN,STORE,RFROM,RFROM 1134 0014D2 ............ DW TICKSOURCE,TWOSTORE,EXIT 1135 0014D8 1136 0014D8 #define PREFIXPROMPT 0 1137 0014D8 1138 0014D8 ; C DOTSTATUS -- display system status 1139 0014D8 HEADLESS DOTSTATUS,DOCOLON 1139.1 000000 PUBLIC DOTSTATUS 1139.2 0014D8 IF 'DOCOLON'='DOCODE' 1139.3 0014D8 DOTSTATUS: DW $+2 1139.4 0014D8 ELSE 1139.5 0014D8 .... DOTSTATUS: DW DOCOLON 1139.6 0014DA ENDIF 1139.7 0014DA ENDM 1140 0014DA ....1100.... DW lit,11H,EMIT ; send XON 1141 0014E0 .... DW CR 1142 0014E2 IF PREFIXPROMPT=1 1143 0014E2 DW XISQUOTE 1144 0014E2 DB 3,'OK ' ; for prefix prompt style 1145 0014E2 DW ITYPE 1146 0014E2 ENDIF 1147 0014E2 .... DW EXIT 1148 0014E4 1149 0014E4 ; C PROMPT -- prompt user 1150 0014E4 HEADLESS PROMPT,DOCOLON 1150.1 000000 PUBLIC PROMPT 1150.2 0014E4 IF 'DOCOLON'='DOCODE' 1150.3 0014E4 PROMPT: DW $+2 1150.4 0014E4 ELSE 1150.5 0014E4 .... PROMPT: DW DOCOLON 1150.6 0014E6 ENDIF 1150.7 0014E6 ENDM 1151 0014E6 IF PREFIXPROMPT!=1 1152 0014E6 ............* DW STATE,FETCH,ZEROEQUAL,qbran 1153 0014EE DEST PROMPT1 1153.1 0014EE 2800 DW PROMPT1-$ 1153.2 0014F0 ENDM 1154 0014F0 ....0600.... DW lit,06H,EMIT ; send ACK 1155 0014F6 ............* DW BASE,FETCH,DUP,HEX,lit,'$',EMIT,lit - 4e-core430G2553 - Page 112 ,02,ZEROUDOTR,BASE,STORE 1156 00150E .... DW XISQUOTE 1157 001510 036F6B20 DB 3,'ok ' ; for traditional Forth style 1158 001514 .... DW ITYPE 1159 001516 ENDIF 1160 001516 .... PROMPT1:DW EXIT 1161 001518 1162 001518 1163 001518 ;C QUIT -- R: i*x -- interpret from kbd 1164 001518 ; L0 LP ! R0 RP! 0 STATE ! 1165 001518 ; BEGIN 1166 001518 ; xon EMIT 1167 001518 ; TIB DUP TIBSIZE ACCEPT 1168 001518 ; xoff EMIT SPACE 1169 001518 ; INTERPRET 1170 001518 ; CR STATE @ 0= IF ." OK" THEN 1171 001518 ; AGAIN ; 1172 001518 HEADER QUIT,4,'QUIT',DOCOLON 1172.1 000000 PUBLIC QUIT 1172.2 001518 .... DW link 1172.3 00151A FF DB 0FFh ; not immediate 1172.4 00151B link SET $ 1172.5 00151B 04 DB 4 1172.6 00151C 51554954 DB 'QUIT' 1172.7 001520 EVEN 1172.8 001520 IF 'DOCOLON'='DOCODE' 1172.9 001520 QUIT: DW $+2 1172.10 001520 ELSE 1172.11 001520 .... QUIT: DW DOCOLON 1172.12 001522 ENDIF 1172.13 001522 ENDM 1173 001522 ............ DW L0,LP,STORE 1174 001528 ............* DW RZERO,RPSTORE,ZERO,STATE,STORE 1175 001532 .... QUIT1: DW DOTSTATUS 1176 001534 ............* DW TIB,DUP,TIBSIZE,ACCEPT 1177 00153C ; DW lit,13H,EMIT ; send XOFF 1178 00153C .... DW SPACE 1179 00153E .... DW INTERPRET 1180 001540 .... DW PROMPT 1181 001542 .... DW bran 1182 001544 DEST QUIT1 1182.1 001544 EEFF DW QUIT1-$ 1182.2 001546 ENDM 1183 000000 PUBLIC QUITIP 1184 001546 QUITIP equ QUIT+2 1185 001546 1186 001546 ;C ABORT i*x -- R: j*x -- clear stk & QUIT 1187 001546 ; S0 SP! QUIT ; 1188 001546 HEADER ABORT,5,'ABORT',DOCOLON 1188.1 000000 PUBLIC ABORT 1188.2 001546 .... DW link 1188.3 001548 FF DB 0FFh ; not immediate 1188.4 001549 link SET $ 1188.5 001549 05 DB 5 1188.6 00154A 41424F5254 DB 'ABORT' 1188.7 00154F 00 EVEN 1188.8 001550 IF 'DOCOLON'='DOCODE' 1188.9 001550 ABORT: DW $+2 1188.10 001550 ELSE 1188.11 001550 .... ABORT: DW DOCOLON 1188.12 001552 ENDIF 1188.13 001552 ENDM 1189 001552 ............ abort1 DW S0,SPSTORE,QUIT ; QUIT never returns 1190 001558 1191 001558 ;Z ?ABORT f c-addr u -- abort & print msg 1192 001558 ; ROT IF ITYPE ABORT THEN 2DROP ; 1193 001558 HEADER QABORT,6,'?ABORT',DOCOLON 1193.1 000000 PUBLIC QABORT 1193.2 001558 .... DW link 1193.3 00155A FF DB 0FFh ; not immediate 1193.4 00155B link SET $ 1193.5 00155B 06 DB 6 - 4e-core430G2553 - Page 113 1193.6 00155C 3F41424F5254 DB '?ABORT' 1193.7 001562 EVEN 1193.8 001562 IF 'DOCOLON'='DOCODE' 1193.9 001562 QABORT: DW $+2 1193.10 001562 ELSE 1193.11 001562 .... QABORT: DW DOCOLON 1193.12 001564 ENDIF 1193.13 001564 ENDM 1194 001564 ........ DW ROT,qbran 1195 001568 DEST QABO1 1195.1 001568 0600 DW QABO1-$ 1195.2 00156A ENDM 1196 00156A ........ DW ITYPE,ABORT 1197 00156E ........ QABO1: DW TWODROP,EXIT 1198 001572 1199 001572 ;C ABORT" i*x 0 -- i*x R: j*x -- j*x x1=0 1200 001572 ;C ABORT" i*x x1 -- R: j*x -- x1<>0 1201 001572 ; POSTPONE IS" POSTPONE ?ABORT ; IMMEDIATE 1202 001572 IMMED ABORTQUOTE,6,'ABORT"',DOCOLON 1202.1 000000 PUBLIC ABORTQUOTE 1202.2 001572 .... DW link 1202.3 001574 FE DB 0FEh // ; immediate (LSB=0 ) 1202.4 001575 link SET $ 1202.5 001575 06 DB 6 1202.6 001576 41424F525422 DB 'ABORT"' 1202.7 00157C EVEN 1202.8 00157C IF 'DOCOLON'='DOCODE' 1202.9 00157C ABORTQUOTE: DW $+2 1202.10 00157C ELSE 1202.11 00157C .... ABORTQUOTE: DW DOCOLON 1202.12 00157E ENDIF 1202.13 00157E ENDM 1203 00157E .... DW ISQUOTE 1204 001580 ............ DW lit,QABORT,COMMAXT 1205 001586 .... DW EXIT 1206 001588 1207 001588 ;C ' -- xt find word in dictionary 1208 001588 ; BL WORD CAPITALIZE FIND 1209 001588 ; 0= ABORT" ?" ; 1210 001588 HEADER TICK,1,27h,DOCOLON 1210.1 000000 PUBLIC TICK 1210.2 001588 .... DW link 1210.3 00158A FF DB 0FFh ; not immediate 1210.4 00158B link SET $ 1210.5 00158B 01 DB 1 1210.6 00158C 27 DB 27h 1210.7 00158D 00 EVEN 1210.8 00158E IF 'DOCOLON'='DOCODE' 1210.9 00158E TICK: DW $+2 1210.10 00158E ELSE 1210.11 00158E .... TICK: DW DOCOLON 1210.12 001590 ENDIF 1210.13 001590 ENDM 1211 001590 ............* DW BLANK,WORDD,CAPITALIZE,FIND,ZEROEQUAL ,XISQUOTE 1212 00159C 013F DB 1,'?' 1213 00159E ........ DW QABORT,EXIT 1214 0015A2 1215 0015A2 ;C CHAR -- char parse ASCII character 1216 0015A2 ; BL WORD 1+ C@ ; 1217 0015A2 HEADER CHARR,4,'CHAR',DOCOLON 1217.1 000000 PUBLIC CHARR 1217.2 0015A2 .... DW link 1217.3 0015A4 FF DB 0FFh ; not immediate 1217.4 0015A5 link SET $ 1217.5 0015A5 04 DB 4 1217.6 0015A6 43484152 DB 'CHAR' 1217.7 0015AA EVEN 1217.8 0015AA IF 'DOCOLON'='DOCODE' 1217.9 0015AA CHARR: DW $+2 1217.10 0015AA ELSE 1217.11 0015AA .... CHARR: DW DOCOLON 1217.12 0015AC ENDIF - 4e-core430G2553 - Page 114 1217.13 0015AC ENDM 1218 0015AC ............* DW BLANK,WORDD,ONEPLUS,CFETCH,EXIT 1219 0015B6 1220 0015B6 ;C [CHAR] -- compile character literal 1221 0015B6 ; CHAR ['] LIT ,XT I, ; IMMEDIATE 1222 0015B6 IMMED BRACCHAR,6,'[CHAR]',DOCOLON 1222.1 000000 PUBLIC BRACCHAR 1222.2 0015B6 .... DW link 1222.3 0015B8 FE DB 0FEh // ; immediate (LSB=0) 1222.4 0015B9 link SET $ 1222.5 0015B9 06 DB 6 1222.6 0015BA 5B434841525D DB '[CHAR]' 1222.7 0015C0 EVEN 1222.8 0015C0 IF 'DOCOLON'='DOCODE' 1222.9 0015C0 BRACCHAR: DW $+2 1222.10 0015C0 ELSE 1222.11 0015C0 .... BRACCHAR: DW DOCOLON 1222.12 0015C2 ENDIF 1222.13 0015C2 ENDM 1223 0015C2 .... DW CHARR 1224 0015C4 ............ DW lit,lit,COMMAXT 1225 0015CA ........ DW ICOMMA,EXIT 1226 0015CE 1227 0015CE ;C ( -- skip input until ) 1228 0015CE ; [ HEX ] 29 PARSE 2DROP ; IMMEDIATE 1229 0015CE IMMED PAREN,1,'(',DOCOLON 1229.1 000000 PUBLIC PAREN 1229.2 0015CE .... DW link 1229.3 0015D0 FE DB 0FEh // ; immediate (LSB=0) 1229.4 0015D1 link SET $ 1229.5 0015D1 01 DB 1 1229.6 0015D2 28 DB '(' 1229.7 0015D3 00 EVEN 1229.8 0015D4 IF 'DOCOLON'='DOCODE' 1229.9 0015D4 PAREN: DW $+2 1229.10 0015D4 ELSE 1229.11 0015D4 .... PAREN: DW DOCOLON 1229.12 0015D6 ENDIF 1229.13 0015D6 ENDM 1230 0015D6 ....2900....* DW lit,29H,PARSE,TWODROP,EXIT 1231 0015E0 1232 0015E0 ; COMPILER ===================================== = 1233 0015E0 1234 0015E0 ;Z HEADER -- create a Forth word header 1235 0015E0 ; LATEST @ H, 0FF HC, link & IMMED field 1236 0015E0 ; HHERE LATEST ! new "latest" link 1237 0015E0 ; BL HWORD HC@ 1+ HALLOT name field 1238 0015E0 ; ALIGN ; 1239 0015E0 ; Separate headers model. 1240 0015E0 HEADER HEADR,6,'HEADER',DOCOLON 1240.1 000000 PUBLIC HEADR 1240.2 0015E0 .... DW link 1240.3 0015E2 FF DB 0FFh ; not immediate 1240.4 0015E3 link SET $ 1240.5 0015E3 06 DB 6 1240.6 0015E4 484541444552 DB 'HEADER' 1240.7 0015EA EVEN 1240.8 0015EA IF 'DOCOLON'='DOCODE' 1240.9 0015EA HEADR: DW $+2 1240.10 0015EA ELSE 1240.11 0015EA .... HEADR: DW DOCOLON 1240.12 0015EC ENDIF 1240.13 0015EC ENDM 1241 0015EC ............ DW LATEST,FETCH,HCOMMA ; link 1242 0015F2 ....FF00.... DW lit,0FFh,HCCOMMA ; immediate flag - see note below 1243 0015F8 ............ DW HHERE,LATEST,STORE 1244 0015FE ............* DW BLANK,HWORD,HCFETCH,ONEPLUS,HALLOT - 4e-core430G2553 - Page 115 1245 001608 ........ DW ALIGNN,EXIT ; MSP430: headers in I space must be aligned 1246 00160C ; Note for Flashable MSP430: when compiling to RAM, we need to set 1247 00160C ; the immediate byte to 0FFH. When compiling to Flash, the word IC! 1248 00160C ; will not write 0FFH to erased Flash (because the byte is already 0FFH). 1249 00160C ; Thus we can write this byte at a later time (with IMMEDIATE). 1250 00160C 1251 00160C ;Z ) -- run-time action of DOES> 1268 00163E ; R> adrs of headless DOES> def'n 1269 00163E ; LATEST @ NFA>CFA code field to fix up 1270 00163E ; !CF ; 1271 00163E HEADER XDOES,7,'(DOES>)',DOCOLON 1271.1 000000 PUBLIC XDOES 1271.2 00163E .... DW link 1271.3 001640 FF DB 0FFh ; not immediate 1271.4 001641 link SET $ 1271.5 001641 07 DB 7 1271.6 001642 28444F45533E* DB '(DOES>)' 1271.7 001649 00 EVEN 1271.8 00164A IF 'DOCOLON'='DOCODE' 1271.9 00164A XDOES: DW $+2 1271.10 00164A ELSE 1271.11 00164A .... XDOES: DW DOCOLON - 4e-core430G2553 - Page 116 1271.12 00164C ENDIF 1271.13 00164C ENDM 1272 00164C ............* DW RFROM,LATEST,FETCH,NFATOCFA,STORECF 1273 001656 .... DW EXIT 1274 001658 1275 001658 ;C DOES> -- change action of latest def'n 1276 001658 ; COMPILE (DOES>) 1277 001658 ; dodoes ,JMP ; IMMEDIATE 1278 001658 ; Note that MSP430 uses a JMP, not a CALL, to DODOES. 1279 001658 IMMED DOES,5,'DOES>',DOCOLON 1279.1 000000 PUBLIC DOES 1279.2 001658 .... DW link 1279.3 00165A FE DB 0FEh // ; immediate (LSB=0) 1279.4 00165B link SET $ 1279.5 00165B 05 DB 5 1279.6 00165C 444F45533E DB 'DOES>' 1279.7 001661 00 EVEN 1279.8 001662 IF 'DOCOLON'='DOCODE' 1279.9 001662 DOES: DW $+2 1279.10 001662 ELSE 1279.11 001662 .... DOES: DW DOCOLON 1279.12 001664 ENDIF 1279.13 001664 ENDM 1280 001664 ............ DW lit,XDOES,COMMAXT 1281 00166A ............* DW lit,dodoes,COMMAJMP,EXIT 1282 001672 1283 001672 ;C RECURSE -- recurse current definition 1284 001672 ; LATEST @ NFA>CFA ,XT ; IMMEDIATE 1285 001672 ; NEWEST @ NFA>CFA ,XT ; IMMEDIATE Flashable 1286 001672 IMMED RECURSE,7,'RECURSE',DOCOLON 1286.1 000000 PUBLIC RECURSE 1286.2 001672 .... DW link 1286.3 001674 FE DB 0FEh // ; immediate (LSB=0) 1286.4 001675 link SET $ 1286.5 001675 07 DB 7 1286.6 001676 524543555253* DB 'RECURSE' 1286.7 00167D 00 EVEN 1286.8 00167E IF 'DOCOLON'='DOCODE' 1286.9 00167E RECURSE: DW $+2 1286.10 00167E ELSE 1286.11 00167E .... RECURSE: DW DOCOLON 1286.12 001680 ENDIF 1286.13 001680 ENDM 1287 001680 ............* DW NEWEST,FETCH,NFATOCFA,COMMAXT,EXIT 1288 00168A 1289 00168A ;C [ -- enter interpretive state 1290 00168A ; 0 STATE ! ; IMMEDIATE 1291 00168A IMMED LEFTBRACKET,1,'[',DOCOLON 1291.1 000000 PUBLIC LEFTBRACKET 1291.2 00168A .... DW link 1291.3 00168C FE DB 0FEh // ; immediate (LSB=0) 1291.4 00168D link SET $ 1291.5 00168D 01 DB 1 1291.6 00168E 5B DB '[' 1291.7 00168F 00 EVEN 1291.8 001690 IF 'DOCOLON'='DOCODE' 1291.9 001690 LEFTBRACKET: DW $+2 1291.10 001690 ELSE 1291.11 001690 .... LEFTBRACKET: DW DOCOLON 1291.12 001692 ENDIF 1291.13 001692 ENDM 1292 001692 ............* DW ZERO,STATE,STORE,EXIT 1293 00169A 1294 00169A ;C ] -- enter compiling state 1295 00169A ; -1 STATE ! ; 1296 00169A HEADER RIGHTBRACKET,1,']',DOCOLON 1296.1 000000 PUBLIC RIGHTBRACKET 1296.2 00169A .... DW link 1296.3 00169C FF DB 0FFh ; not immediate 1296.4 00169D link SET $ 1296.5 00169D 01 DB 1 - 4e-core430G2553 - Page 117 1296.6 00169E 5D DB ']' 1296.7 00169F 00 EVEN 1296.8 0016A0 IF 'DOCOLON'='DOCODE' 1296.9 0016A0 RIGHTBRACKET: DW $+2 1296.10 0016A0 ELSE 1296.11 0016A0 .... RIGHTBRACKET: DW DOCOLON 1296.12 0016A2 ENDIF 1296.13 0016A2 ENDM 1297 0016A2 ....FFFF....* DW lit,-1,STATE,STORE,EXIT 1298 0016AC 1299 0016AC ;Z HIDE -- "hide" latest definition Flashable 1300 0016AC ; LATEST @ DUP NEWEST ! NFA>LFA H@ LATEST ! ; 1301 0016AC HEADER HIDE,4,'HIDE',DOCOLON 1301.1 000000 PUBLIC HIDE 1301.2 0016AC .... DW link 1301.3 0016AE FF DB 0FFh ; not immediate 1301.4 0016AF link SET $ 1301.5 0016AF 04 DB 4 1301.6 0016B0 48494445 DB 'HIDE' 1301.7 0016B4 EVEN 1301.8 0016B4 IF 'DOCOLON'='DOCODE' 1301.9 0016B4 HIDE: DW $+2 1301.10 0016B4 ELSE 1301.11 0016B4 .... HIDE: DW DOCOLON 1301.12 0016B6 ENDIF 1301.13 0016B6 ENDM 1302 0016B6 ............* DW LATEST,FETCH,DUP,NEWEST,STORE 1303 0016C0 ............* DW NFATOLFA,HFETCH,LATEST,STORE,EXIT 1304 0016CA 1305 0016CA ;Z REVEAL -- "reveal" latest definition Flashable 1306 0016CA ; NEWEST @ LATEST ! ; 1307 0016CA HEADER REVEAL,6,'REVEAL',DOCOLON 1307.1 000000 PUBLIC REVEAL 1307.2 0016CA .... DW link 1307.3 0016CC FF DB 0FFh ; not immediate 1307.4 0016CD link SET $ 1307.5 0016CD 06 DB 6 1307.6 0016CE 52455645414C DB 'REVEAL' 1307.7 0016D4 EVEN 1307.8 0016D4 IF 'DOCOLON'='DOCODE' 1307.9 0016D4 REVEAL: DW $+2 1307.10 0016D4 ELSE 1307.11 0016D4 .... REVEAL: DW DOCOLON 1307.12 0016D6 ENDIF 1307.13 0016D6 ENDM 1308 0016D6 ............* DW NEWEST,FETCH,LATEST,STORE,EXIT 1309 0016E0 1310 0016E0 ;C IMMEDIATE -- make last def'n immediate 1311 0016E0 ; 0FE LATEST @ 1- HC! ; set Flashable immediate flag 1312 0016E0 HEADER IMMEDIATE,9,'IMMEDIATE',DOCOLON 1312.1 000000 PUBLIC IMMEDIATE 1312.2 0016E0 .... DW link 1312.3 0016E2 FF DB 0FFh ; not immediate 1312.4 0016E3 link SET $ 1312.5 0016E3 09 DB 9 1312.6 0016E4 494D4D454449* DB 'IMMEDIATE' 1312.7 0016ED 00 EVEN 1312.8 0016EE IF 'DOCOLON'='DOCODE' 1312.9 0016EE IMMEDIATE: DW $+2 1312.10 0016EE ELSE 1312.11 0016EE .... IMMEDIATE: DW DOCOLON 1312.12 0016F0 ENDIF 1312.13 0016F0 ENDM 1313 0016F0 ....FE00....* DW lit,0FEh,LATEST,FETCH,ONEMINUS,HCSTOR E 1314 0016FC .... DW EXIT 1315 0016FE 1316 0016FE ;C : -- begin a colon definition 1317 0016FE ; DUP CELL+ >R @ ,XT ; 1364 001770 ; The phrase ['] xxx ,XT appears so often that 1365 001770 ; this word was created to combine the actions 1366 001770 ; of LIT and ,XT. It takes an inline literal 1367 001770 ; execution token and appends it to the dict. 1368 001770 ; HEADER COMPILE,7,'COMPILE',DOCOLON 1369 001770 ; DW RFROM,DUP,CELLPLUS,TOR 1370 001770 ; DW FETCH,COMMAXT,EXIT 1371 001770 ; N.B.: not used in the current implementation 1372 001770 1373 001770 ; CONTROL STRUCTURES =========================== = 1374 001770 1375 001770 ;C IF -- adrs conditional forward branch 1376 001770 ; ['] qbran ,BRANCH IHERE ,NONE ; Flashable 1377 001770 ; IMMEDIATE 1378 001770 IMMED IFF,2,'IF',DOCOLON 1378.1 000000 PUBLIC IFF 1378.2 001770 .... DW link 1378.3 001772 FE DB 0FEh // ; immediate (LSB=0) 1378.4 001773 link SET $ 1378.5 001773 02 DB 2 1378.6 001774 4946 DB 'IF' 1378.7 001776 EVEN 1378.8 001776 IF 'DOCOLON'='DOCODE' 1378.9 001776 IFF: DW $+2 1378.10 001776 ELSE 1378.11 001776 .... IFF: DW DOCOLON 1378.12 001778 ENDIF 1378.13 001778 ENDM 1379 001778 ............ DW lit,qbran,COMMABRANCH - 4e-core430G2553 - Page 120 1380 00177E ............ DW IHERE,COMMANONE,EXIT 1381 001784 1382 001784 ;C THEN adrs -- resolve forward branch 1383 001784 ; IHERE SWAP !DEST ; IMMEDIATE 1384 001784 IMMED THEN,4,'THEN',DOCOLON 1384.1 000000 PUBLIC THEN 1384.2 001784 .... DW link 1384.3 001786 FE DB 0FEh // ; immediate (LSB=0) 1384.4 001787 link SET $ 1384.5 001787 04 DB 4 1384.6 001788 5448454E DB 'THEN' 1384.7 00178C EVEN 1384.8 00178C IF 'DOCOLON'='DOCODE' 1384.9 00178C THEN: DW $+2 1384.10 00178C ELSE 1384.11 00178C .... THEN: DW DOCOLON 1384.12 00178E ENDIF 1384.13 00178E ENDM 1385 00178E ............* DW IHERE,SWAP,STOREDEST,EXIT 1386 001796 1387 001796 ;C ELSE adrs1 -- adrs2 branch for IF..ELSE 1388 001796 ; ['] branch ,BRANCH IHERE ,NONE Flashable 1389 001796 ; SWAP POSTPONE THEN ; IMMEDIATE 1390 001796 IMMED ELSS,4,'ELSE',DOCOLON 1390.1 000000 PUBLIC ELSS 1390.2 001796 .... DW link 1390.3 001798 FE DB 0FEh // ; immediate (LSB=0) 1390.4 001799 link SET $ 1390.5 001799 04 DB 4 1390.6 00179A 454C5345 DB 'ELSE' 1390.7 00179E EVEN 1390.8 00179E IF 'DOCOLON'='DOCODE' 1390.9 00179E ELSS: DW $+2 1390.10 00179E ELSE 1390.11 00179E .... ELSS: DW DOCOLON 1390.12 0017A0 ENDIF 1390.13 0017A0 ENDM 1391 0017A0 ............ DW lit,bran,COMMABRANCH 1392 0017A6 ........ DW IHERE,COMMANONE 1393 0017AA ............ DW SWAP,THEN,EXIT 1394 0017B0 1395 0017B0 ;C BEGIN -- adrs target for bwd. branch 1396 0017B0 ; IHERE ; IMMEDIATE 1397 0017B0 IMMED BEGIN,5,'BEGIN',DOCOLON 1397.1 000000 PUBLIC BEGIN 1397.2 0017B0 .... DW link 1397.3 0017B2 FE DB 0FEh // ; immediate (LSB=0) 1397.4 0017B3 link SET $ 1397.5 0017B3 05 DB 5 1397.6 0017B4 424547494E DB 'BEGIN' 1397.7 0017B9 00 EVEN 1397.8 0017BA IF 'DOCOLON'='DOCODE' 1397.9 0017BA BEGIN: DW $+2 1397.10 0017BA ELSE 1397.11 0017BA .... BEGIN: DW DOCOLON 1397.12 0017BC ENDIF 1397.13 0017BC ENDM 1398 0017BC ........ DW IHERE,EXIT 1399 0017C0 1400 0017C0 ;C UNTIL adrs -- conditional backward branch 1401 0017C0 ; ['] qbran ,BRANCH ,DEST ; IMMEDIATE 1402 0017C0 ; conditional backward branch 1403 0017C0 IMMED UNTIL,5,'UNTIL',DOCOLON 1403.1 000000 PUBLIC UNTIL 1403.2 0017C0 .... DW link 1403.3 0017C2 FE DB 0FEh // ; immediate (LSB=0) 1403.4 0017C3 link SET $ 1403.5 0017C3 05 DB 5 1403.6 0017C4 554E54494C DB 'UNTIL' - 4e-core430G2553 - Page 121 1403.7 0017C9 00 EVEN 1403.8 0017CA IF 'DOCOLON'='DOCODE' 1403.9 0017CA UNTIL: DW $+2 1403.10 0017CA ELSE 1403.11 0017CA .... UNTIL: DW DOCOLON 1403.12 0017CC ENDIF 1403.13 0017CC ENDM 1404 0017CC ............ DW lit,qbran,COMMABRANCH 1405 0017D2 ........ DW COMMADEST,EXIT 1406 0017D6 1407 0017D6 ;X AGAIN adrs -- uncond'l backward branch 1408 0017D6 ; ['] branch ,BRANCH ,DEST ; IMMEDIATE 1409 0017D6 ; unconditional backward branch 1410 0017D6 IMMED AGAIN,5,'AGAIN',DOCOLON 1410.1 000000 PUBLIC AGAIN 1410.2 0017D6 .... DW link 1410.3 0017D8 FE DB 0FEh // ; immediate (LSB=0) 1410.4 0017D9 link SET $ 1410.5 0017D9 05 DB 5 1410.6 0017DA 414741494E DB 'AGAIN' 1410.7 0017DF 00 EVEN 1410.8 0017E0 IF 'DOCOLON'='DOCODE' 1410.9 0017E0 AGAIN: DW $+2 1410.10 0017E0 ELSE 1410.11 0017E0 .... AGAIN: DW DOCOLON 1410.12 0017E2 ENDIF 1410.13 0017E2 ENDM 1411 0017E2 ............ DW lit,bran,COMMABRANCH 1412 0017E8 ........ DW COMMADEST,EXIT 1413 0017EC 1414 0017EC ;C WHILE adrs1 -- adrs2 adrs1 branch for WHILE loop 1415 0017EC ; POSTPONE IF SWAP ; IMMEDIATE 1416 0017EC IMMED WHILE,5,'WHILE',DOCOLON 1416.1 000000 PUBLIC WHILE 1416.2 0017EC .... DW link 1416.3 0017EE FE DB 0FEh // ; immediate (LSB=0) 1416.4 0017EF link SET $ 1416.5 0017EF 05 DB 5 1416.6 0017F0 5748494C45 DB 'WHILE' 1416.7 0017F5 00 EVEN 1416.8 0017F6 IF 'DOCOLON'='DOCODE' 1416.9 0017F6 WHILE: DW $+2 1416.10 0017F6 ELSE 1416.11 0017F6 .... WHILE: DW DOCOLON 1416.12 0017F8 ENDIF 1416.13 0017F8 ENDM 1417 0017F8 ............ DW IFF,SWAP,EXIT 1418 0017FE 1419 0017FE ;C REPEAT adrs2 adrs1 -- resolve WHILE loop 1420 0017FE ; POSTPONE AGAIN POSTPONE THEN ; IMMEDIATE 1421 0017FE IMMED REPEAT,6,'REPEAT',DOCOLON 1421.1 000000 PUBLIC REPEAT 1421.2 0017FE .... DW link 1421.3 001800 FE DB 0FEh // ; immediate (LSB=0) 1421.4 001801 link SET $ 1421.5 001801 06 DB 6 1421.6 001802 524550454154 DB 'REPEAT' 1421.7 001808 EVEN 1421.8 001808 IF 'DOCOLON'='DOCODE' 1421.9 001808 REPEAT: DW $+2 1421.10 001808 ELSE 1421.11 001808 .... REPEAT: DW DOCOLON 1421.12 00180A ENDIF 1421.13 00180A ENDM 1422 00180A ............ DW AGAIN,THEN,EXIT 1423 001810 1424 001810 ;Z >L x -- L: -- x move to leave stack 1425 001810 ; CELL LP +! LP @ ! ; (L stack grows up) 1426 001810 HEADER TOL,2,'>L',DOCOLON 1426.1 000000 PUBLIC TOL - 4e-core430G2553 - Page 122 1426.2 001810 .... DW link 1426.3 001812 FF DB 0FFh ; not immediate 1426.4 001813 link SET $ 1426.5 001813 02 DB 2 1426.6 001814 3E4C DB '>L' 1426.7 001816 EVEN 1426.8 001816 IF 'DOCOLON'='DOCODE' 1426.9 001816 TOL: DW $+2 1426.10 001816 ELSE 1426.11 001816 .... TOL: DW DOCOLON 1426.12 001818 ENDIF 1426.13 001818 ENDM 1427 001818 ............* DW CELL,LP,PLUSSTORE,LP,FETCH,STORE,EXIT 1428 001826 1429 001826 ;Z L> -- x L: x -- move from leave stack 1430 001826 ; LP @ @ CELL NEGATE LP +! ; 1431 001826 HEADER LFROM,2,'L>',DOCOLON 1431.1 000000 PUBLIC LFROM 1431.2 001826 .... DW link 1431.3 001828 FF DB 0FFh ; not immediate 1431.4 001829 link SET $ 1431.5 001829 02 DB 2 1431.6 00182A 4C3E DB 'L>' 1431.7 00182C EVEN 1431.8 00182C IF 'DOCOLON'='DOCODE' 1431.9 00182C LFROM: DW $+2 1431.10 00182C ELSE 1431.11 00182C .... LFROM: DW DOCOLON 1431.12 00182E ENDIF 1431.13 00182E ENDM 1432 00182E ............ DW LP,FETCH,FETCH 1433 001834 ............* DW CELL,NEGATE,LP,PLUSSTORE,EXIT 1434 00183E 1435 00183E ;C DO -- adrs L: -- 0 start a loop 1436 00183E ; ['] xdo ,XT IHERE target for bwd branch 1437 00183E ; 0 >L ; IMMEDIATE marker for LEAVEs 1438 00183E IMMED DO,2,'DO',DOCOLON 1438.1 000000 PUBLIC DO 1438.2 00183E .... DW link 1438.3 001840 FE DB 0FEh // ; immediate (LSB=0) 1438.4 001841 link SET $ 1438.5 001841 02 DB 2 1438.6 001842 444F DB 'DO' 1438.7 001844 EVEN 1438.8 001844 IF 'DOCOLON'='DOCODE' 1438.9 001844 DO: DW $+2 1438.10 001844 ELSE 1438.11 001844 .... DO: DW DOCOLON 1438.12 001846 ENDIF 1438.13 001846 ENDM 1439 001846 ............* DW lit,xdo,COMMAXT,IHERE 1440 00184E ............ DW ZERO,TOL,EXIT 1441 001854 1442 001854 ;Z ENDLOOP adrs xt -- L: 0 a1 a2 .. aN -- common factor of LOOP and +LOOP 1443 001854 ; ,BRANCH ,DEST backward loop 1444 001854 ; BEGIN L> ?DUP WHILE POSTPONE THEN REPEAT ; 1445 001854 ; resolve LEAVEs 1446 001854 ; This is a common factor of LOOP and +LOOP. 1447 001854 HEADER ENDLOOP,7,'ENDLOOP',DOCOLON 1447.1 000000 PUBLIC ENDLOOP 1447.2 001854 .... DW link 1447.3 001856 FF DB 0FFh ; not immediate 1447.4 001857 link SET $ 1447.5 001857 07 DB 7 1447.6 001858 454E444C4F4F* DB 'ENDLOOP' 1447.7 00185F 00 EVEN 1447.8 001860 IF 'DOCOLON'='DOCODE' 1447.9 001860 ENDLOOP: DW $+2 1447.10 001860 ELSE - 4e-core430G2553 - Page 123 1447.11 001860 .... ENDLOOP: DW DOCOLON 1447.12 001862 ENDIF 1447.13 001862 ENDM 1448 001862 ........ DW COMMABRANCH,COMMADEST 1449 001866 ............ LOOP1: DW LFROM,QDUP,qbran 1450 00186C DEST LOOP2 1450.1 00186C 0800 DW LOOP2-$ 1450.2 00186E ENDM 1451 00186E ........ DW THEN,bran 1452 001872 DEST LOOP1 1452.1 001872 F4FF DW LOOP1-$ 1452.2 001874 ENDM 1453 001874 .... LOOP2: DW EXIT 1454 001876 1455 001876 ;C LOOP adrs -- L: 0 a1 a2 .. aN -- finish a loop 1456 001876 ; ['] xloop ENDLOOP ; IMMEDIATE 1457 001876 IMMED LOO,4,'LOOP',DOCOLON 1457.1 000000 PUBLIC LOO 1457.2 001876 .... DW link 1457.3 001878 FE DB 0FEh // ; immediate (LSB=0) 1457.4 001879 link SET $ 1457.5 001879 04 DB 4 1457.6 00187A 4C4F4F50 DB 'LOOP' 1457.7 00187E EVEN 1457.8 00187E IF 'DOCOLON'='DOCODE' 1457.9 00187E LOO: DW $+2 1457.10 00187E ELSE 1457.11 00187E .... LOO: DW DOCOLON 1457.12 001880 ENDIF 1457.13 001880 ENDM 1458 001880 ............* DW lit,xloop,ENDLOOP,EXIT 1459 001888 1460 001888 ;C +LOOP adrs -- L: 0 a1 a2 .. aN -- finish a loop 1461 001888 ; ['] xplusloop ENDLOOP ; IMMEDIATE 1462 001888 IMMED PLUSLOOP,5,'+LOOP',DOCOLON 1462.1 000000 PUBLIC PLUSLOOP 1462.2 001888 .... DW link 1462.3 00188A FE DB 0FEh // ; immediate (LSB=0) 1462.4 00188B link SET $ 1462.5 00188B 05 DB 5 1462.6 00188C 2B4C4F4F50 DB '+LOOP' 1462.7 001891 00 EVEN 1462.8 001892 IF 'DOCOLON'='DOCODE' 1462.9 001892 PLUSLOOP: DW $+2 1462.10 001892 ELSE 1462.11 001892 .... PLUSLOOP: DW DOCOLON 1462.12 001894 ENDIF 1462.13 001894 ENDM 1463 001894 ............* DW lit,xplusloop,ENDLOOP,EXIT 1464 00189C 1465 00189C ;C LEAVE -- L: -- adrs 1466 00189C ; ['] UNLOOP ,XT 1467 00189C ; ['] branch ,BRANCH IHERE ,NONE >L 1468 00189C ; ; IMMEDIATE unconditional forward branch 1469 00189C IMMED LEAV,5,'LEAVE',DOCOLON 1469.1 000000 PUBLIC LEAV 1469.2 00189C .... DW link 1469.3 00189E FE DB 0FEh // ; immediate (LSB=0) 1469.4 00189F link SET $ 1469.5 00189F 05 DB 5 1469.6 0018A0 4C45415645 DB 'LEAVE' 1469.7 0018A5 00 EVEN 1469.8 0018A6 IF 'DOCOLON'='DOCODE' 1469.9 0018A6 LEAV: DW $+2 1469.10 0018A6 ELSE 1469.11 0018A6 .... LEAV: DW DOCOLON 1469.12 0018A8 ENDIF 1469.13 0018A8 ENDM 1470 0018A8 ............ DW lit,UNLOOP,COMMAXT 1471 0018AE ............ DW lit,bran,COMMABRANCH 1472 0018B4 ............* DW IHERE,COMMANONE,TOL,EXIT 1473 0018BC - 4e-core430G2553 - Page 124 1474 0018BC ; OTHER OPERATIONS ============================= = 1475 0018BC 1476 0018BC ;X WITHIN n1|u1 n2|u2 n3|u3 -- f n2<=n1R - R> U< ; per ANS document 1478 0018BC HEADER WITHIN,6,'WITHIN',DOCOLON 1478.1 000000 PUBLIC WITHIN 1478.2 0018BC .... DW link 1478.3 0018BE FF DB 0FFh ; not immediate 1478.4 0018BF link SET $ 1478.5 0018BF 06 DB 6 1478.6 0018C0 57495448494E DB 'WITHIN' 1478.7 0018C6 EVEN 1478.8 0018C6 IF 'DOCOLON'='DOCODE' 1478.9 0018C6 WITHIN: DW $+2 1478.10 0018C6 ELSE 1478.11 0018C6 .... WITHIN: DW DOCOLON 1478.12 0018C8 ENDIF 1478.13 0018C8 ENDM 1479 0018C8 ............* DW OVER,MINUS,TOR,MINUS,RFROM,ULESS,EXIT 1480 0018D6 1481 0018D6 ;C MOVE addr1 addr2 u -- smart move 1482 0018D6 ; VERSION FOR 1 ADDRESS UNIT = 1 CHAR 1483 0018D6 ; >R 2DUP SWAP DUP R@ + -- ... dst src src+n 1484 0018D6 ; WITHIN IF R> CMOVE> src <= dst < src+n 1485 0018D6 ; ELSE R> CMOVE THEN ; otherwise 1486 0018D6 HEADER MOVE,4,'MOVE',DOCOLON 1486.1 000000 PUBLIC MOVE 1486.2 0018D6 .... DW link 1486.3 0018D8 FF DB 0FFh ; not immediate 1486.4 0018D9 link SET $ 1486.5 0018D9 04 DB 4 1486.6 0018DA 4D4F5645 DB 'MOVE' 1486.7 0018DE EVEN 1486.8 0018DE IF 'DOCOLON'='DOCODE' 1486.9 0018DE MOVE: DW $+2 1486.10 0018DE ELSE 1486.11 0018DE .... MOVE: DW DOCOLON 1486.12 0018E0 ENDIF 1486.13 0018E0 ENDM 1487 0018E0 ............* DW TOR,TWODUP,SWAP,DUP,RFETCH,PLUS 1488 0018EC ........ DW WITHIN,qbran 1489 0018F0 DEST MOVE1 1489.1 0018F0 0A00 DW MOVE1-$ 1489.2 0018F2 ENDM 1490 0018F2 ............ DW RFROM,CMOVEUP,bran 1491 0018F8 DEST MOVE2 1491.1 0018F8 0600 DW MOVE2-$ 1491.2 0018FA ENDM 1492 0018FA ........ MOVE1: DW RFROM,CMOVE 1493 0018FE .... MOVE2: DW EXIT 1494 001900 1495 001900 ;C DEPTH -- +n number of items on stack 1496 001900 ; SP@ S0 SWAP - 2/ ; 16-BIT VERSION! 1497 001900 HEADER DEPTH,5,'DEPTH',DOCOLON 1497.1 000000 PUBLIC DEPTH 1497.2 001900 .... DW link 1497.3 001902 FF DB 0FFh ; not immediate 1497.4 001903 link SET $ 1497.5 001903 05 DB 5 1497.6 001904 4445505448 DB 'DEPTH' 1497.7 001909 00 EVEN 1497.8 00190A IF 'DOCOLON'='DOCODE' 1497.9 00190A DEPTH: DW $+2 1497.10 00190A ELSE 1497.11 00190A .... DEPTH: DW DOCOLON 1497.12 00190C ENDIF 1497.13 00190C ENDM 1498 00190C ............* DW SPFETCH,S0,SWAP,MINUS,TWOSLASH,EXIT 1499 001918 1500 001918 ;C ENVIRONMENT? c-addr u -- false system - 4e-core430G2553 - Page 125 query 1501 001918 ; -- i*x true 1502 001918 ; 2DROP 0 ; the minimal definition! 1503 001918 HEADER ENVIRONMENTQ,12,'ENVIRONMENT?',DOCOL ON 1503.1 000000 PUBLIC ENVIRONMENTQ 1503.2 001918 .... DW link 1503.3 00191A FF DB 0FFh ; not immediate 1503.4 00191B link SET $ 1503.5 00191B 0C DB 12 1503.6 00191C 454E5649524F* DB 'ENVIRONMENT?' 1503.7 001928 EVEN 1503.8 001928 IF 'DOCOLON'='DOCODE' 1503.9 001928 ENVIRONMENTQ: DW $+2 1503.10 001928 ELSE 1503.11 001928 .... ENVIRONMENTQ: DW DOCOLON 1503.12 00192A ENDIF 1503.13 00192A ENDM 1504 00192A ............ DW TWODROP,ZERO,EXIT 1505 001930 1506 001930 ;U UTILITY WORDS ===================== 1507 001930 1508 001930 ;Z NOOP -- do nothing 1509 001930 HEADER NOOP,4,'NOOP',DOCOLON 1509.1 000000 PUBLIC NOOP 1509.2 001930 .... DW link 1509.3 001932 FF DB 0FFh ; not immediate 1509.4 001933 link SET $ 1509.5 001933 04 DB 4 1509.6 001934 4E4F4F50 DB 'NOOP' 1509.7 001938 EVEN 1509.8 001938 IF 'DOCOLON'='DOCODE' 1509.9 001938 NOOP: DW $+2 1509.10 001938 ELSE 1509.11 001938 .... NOOP: DW DOCOLON 1509.12 00193A ENDIF 1509.13 00193A ENDM 1510 00193A .... DW EXIT 1511 00193C 1512 00193C ;Z FLALIGNED a -- a' align IDP to flash boundary 1513 00193C ; $200 OVER - $1FF AND + ; 1514 00193C HEADER FLALIGNED,9,'FLALIGNED',DOCOLON 1514.1 000000 PUBLIC FLALIGNED 1514.2 00193C .... DW link 1514.3 00193E FF DB 0FFh ; not immediate 1514.4 00193F link SET $ 1514.5 00193F 09 DB 9 1514.6 001940 464C414C4947* DB 'FLALIGNED' 1514.7 001949 00 EVEN 1514.8 00194A IF 'DOCOLON'='DOCODE' 1514.9 00194A FLALIGNED: DW $+2 1514.10 00194A ELSE 1514.11 00194A .... FLALIGNED: DW DOCOLON 1514.12 00194C ENDIF 1514.13 00194C ENDM 1515 00194C ....0002....* DW lit,0200h,OVER,MINUS,lit,01FFh,ANDD,P LUS,EXIT 1516 00195E 1517 00195E ;X MARKER -- create word to restore dictionary 1518 00195E ; LATEST @ IHERE HERE 1519 00195E ; IHERE FLALIGNED IDP ! align new word to flash boundary 1520 00195E ; DUP I@ 1522 00195E ; SWAP CELL+ DUP I@ 1523 00195E ; SWAP CELL+ I@ fetch saved -- dp idp latest 1524 00195E ; OVER FLALIGNED IHERE OVER - FLERASE erase Flash from saved to IHERE 1525 00195E ; LATEST ! IDP ! DP ! ; 1526 00195E HEADER MARKER,6,'MARKER',DOCOLON 1526.1 000000 PUBLIC MARKER 1526.2 00195E .... DW link 1526.3 001960 FF DB 0FFh ; not immediate 1526.4 001961 link SET $ 1526.5 001961 06 DB 6 - 4e-core430G2553 - Page 126 1526.6 001962 4D41524B4552 DB 'MARKER' 1526.7 001968 EVEN 1526.8 001968 IF 'DOCOLON'='DOCODE' 1526.9 001968 MARKER: DW $+2 1526.10 001968 ELSE 1526.11 001968 .... MARKER: DW DOCOLON 1526.12 00196A ENDIF 1526.13 00196A ENDM 1527 00196A ............* DW LATEST,FETCH,IHERE,HERE 1528 001972 ............* DW IHERE,FLALIGNED,IDP,STORE 1529 00197A ............* DW BUILDS,ICOMMA,ICOMMA,ICOMMA,XDOES 1530 001984 3040.... MOV #dodoes,PC ; long direct jump to DODOES 1531 001988 ........ DW DUP,IFETCH 1532 00198C ............* DW SWAP,CELLPLUS,DUP,IFETCH 1533 001994 ............ DW SWAP,CELLPLUS,IFETCH 1534 00199A ............* DW OVER,FLALIGNED,IHERE,OVER,MINUS,FLERA SE 1535 0019A6 ............* DW LATEST,STORE,IDP,STORE,DDP,STORE,EXIT 1536 0019B4 1537 0019B4 /*** 1538 0019B4 ;X WORDS -- list all words in dict. 1539 0019B4 ; LATEST @ BEGIN 1540 0019B4 ; DUP HCOUNT 7F AND HTYPE SPACE 1541 0019B4 ; NFA>LFA H@ 1542 0019B4 ; DUP 0= UNTIL 1543 0019B4 ; DROP ; 1544 0019B4 HEADER WORDS,5,'WORDS',DOCOLON 1545 0019B4 DW LATEST,FETCH 1546 0019B4 WDS1: DW DUP,HCOUNT,lit,07FH,ANDD,HTYPE,SPACE 1547 0019B4 DW NFATOLFA,HFETCH 1548 0019B4 DW DUP,ZEROEQUAL,qbran 1549 0019B4 DEST WDS1 1550 0019B4 DW DROP,EXIT 1551 0019B4 ***/ 1552 0019B4 1553 0019B4 ;X WORDS -- list all words in dict. Stop and go key version. 1554 0019B4 ; LATEST @ BEGIN 1555 0019B4 ; KEY? IF KEY DROP KEY 0x0D = IF DROP EXIT THEN THEN 1556 0019B4 ; DUP HCOUNT 7F AND HTYPE SPACE 1557 0019B4 ; NFA>LFA H@ 1558 0019B4 ; DUP 0= UNTIL 1559 0019B4 ; DROP ; 1560 0019B4 HEADER WORDS,5,'WORDS',DOCOLON 1560.1 000000 PUBLIC WORDS 1560.2 0019B4 .... DW link 1560.3 0019B6 FF DB 0FFh ; not immediate 1560.4 0019B7 link SET $ 1560.5 0019B7 05 DB 5 1560.6 0019B8 574F524453 DB 'WORDS' 1560.7 0019BD 00 EVEN 1560.8 0019BE IF 'DOCOLON'='DOCODE' 1560.9 0019BE WORDS: DW $+2 1560.10 0019BE ELSE 1560.11 0019BE .... WORDS: DW DOCOLON 1560.12 0019C0 ENDIF 1560.13 0019C0 ENDM 1561 0019C0 ........ DW LATEST,FETCH 1562 0019C4 ........ WDS1: DW KEYQ,qbran 1563 0019C8 DEST WDS2 1563.1 0019C8 1000 DW WDS2-$ 1563.2 0019CA ENDM 1564 0019CA ........ DW KEY,DROP ; halt 1565 0019CE ............* DW KEY,BLANK,EQUAL,qbran ; go on if blank, else quit words 1566 0019D6 DEST WDS3 1566.1 0019D6 1C00 DW WDS3-$ 1566.2 0019D8 ENDM 1567 0019D8 ............*WDS2: DW DUP,HCOUNT,lit,07FH,ANDD,HTYPE,SPACE 1568 0019E6 ........ DW NFATOLFA,HFETCH 1569 0019EA ............ DW DUP,ZEROEQUAL,qbran 1570 0019F0 DEST WDS1 1570.1 0019F0 D4FF DW WDS1-$ - 4e-core430G2553 - Page 127 1570.2 0019F2 ENDM 1571 0019F2 ........ WDS3: DW DROP,EXIT 1572 0019F6 1573 0019F6 ;X (U.R) u n -- xxx display u unsigned in n width; primitiv 1574 0019F6 ; >R <# 0 #S #> R> OVER - 0 MAX (jump) ; 1575 0019F6 HEADLESS PARENUDOTR,DOCOLON 1575.1 000000 PUBLIC PARENUDOTR 1575.2 0019F6 IF 'DOCOLON'='DOCODE' 1575.3 0019F6 PARENUDOTR: DW $+2 1575.4 0019F6 ELSE 1575.5 0019F6 .... PARENUDOTR: DW DOCOLON 1575.6 0019F8 ENDIF 1575.7 0019F8 ENDM 1576 0019F8 ............* DW TOR,LESSNUM,ZERO,NUMS,NUMGREATER 1577 001A02 ............* DW RFROM,OVER,MINUS,ZERO,MAX 1578 001A0C .... DW EXIT 1579 001A0E 1580 001A0E ;X U.R u n -- display u unsigned in n width 1581 001A0E ; >R <# 0 #S #> R> OVER - 0 MAX SPACES TYPE ; 1582 001A0E HEADER UDOTR,3,'U.R',DOCOLON 1582.1 000000 PUBLIC UDOTR 1582.2 001A0E .... DW link 1582.3 001A10 FF DB 0FFh ; not immediate 1582.4 001A11 link SET $ 1582.5 001A11 03 DB 3 1582.6 001A12 552E52 DB 'U.R' 1582.7 001A15 00 EVEN 1582.8 001A16 IF 'DOCOLON'='DOCODE' 1582.9 001A16 UDOTR: DW $+2 1582.10 001A16 ELSE 1582.11 001A16 .... UDOTR: DW DOCOLON 1582.12 001A18 ENDIF 1582.13 001A18 ENDM 1583 001A18 .... DW PARENUDOTR 1584 001A1A ............ DW SPACES,TYP,EXIT 1585 001A20 1586 001A20 ;X 0U.R u n -- display u unsigned in n width with leading zeros 1587 001A20 ; >R <# 0 #S #> R> OVER - 0 MAX SPACES TYPE ; 1588 001A20 HEADER ZEROUDOTR,4,'0U.R',DOCOLON 1588.1 000000 PUBLIC ZEROUDOTR 1588.2 001A20 .... DW link 1588.3 001A22 FF DB 0FFh ; not immediate 1588.4 001A23 link SET $ 1588.5 001A23 04 DB 4 1588.6 001A24 30552E52 DB '0U.R' 1588.7 001A28 EVEN 1588.8 001A28 IF 'DOCOLON'='DOCODE' 1588.9 001A28 ZEROUDOTR: DW $+2 1588.10 001A28 ELSE 1588.11 001A28 .... ZEROUDOTR: DW DOCOLON 1588.12 001A2A ENDIF 1588.13 001A2A ENDM 1589 001A2A .... DW PARENUDOTR 1590 001A2C ............ DW ZEROS,TYP,EXIT 1591 001A32 1592 001A32 ;X ZEROS n -- output n zeros 1593 001A32 ; BEGIN DUP WHILE ZERO 1- REPEAT DROP ; 1594 001A32 HEADER ZEROS,5,'ZEROS',DOCOLON 1594.1 000000 PUBLIC ZEROS 1594.2 001A32 .... DW link 1594.3 001A34 FF DB 0FFh ; not immediate 1594.4 001A35 link SET $ 1594.5 001A35 05 DB 5 1594.6 001A36 5A45524F53 DB 'ZEROS' 1594.7 001A3B 00 EVEN 1594.8 001A3C IF 'DOCOLON'='DOCODE' 1594.9 001A3C ZEROS: DW $+2 1594.10 001A3C ELSE 1594.11 001A3C .... ZEROS: DW DOCOLON 1594.12 001A3E ENDIF 1594.13 001A3E ENDM - 4e-core430G2553 - Page 128 1595 001A3E ........ ZEROS1: DW DUP,qbran 1596 001A42 DEST ZEROS2 1596.1 001A42 0E00 DW ZEROS2-$ 1596.2 001A44 ENDM 1597 001A44 ....3000....* DW lit,'0',EMIT,ONEMINUS,bran 1598 001A4E DEST ZEROS1 1598.1 001A4E F0FF DW ZEROS1-$ 1598.2 001A50 ENDM 1599 001A50 ........ ZEROS2: DW DROP,EXIT 1600 001A54 1601 001A54 1602 001A54 1603 001A54 ;X DUMP adr n -- dump memory 1604 001A54 ; OVER + SWAP DO 1605 001A54 ; CR I 4 U.R SPACE SPACE 1606 001A54 ; I $10 + I DO I C@ 3 U.R LOOP SPACE SPACE 1607 001A54 ; I $10 + I DO I C@ $7F AND $7E MIN BL MAX EMIT LOOP 1608 001A54 ; 10 +LOOP ; 1609 001A54 HEADER DUMP,4,'DUMP',DOCOLON 1609.1 000000 PUBLIC DUMP 1609.2 001A54 .... DW link 1609.3 001A56 FF DB 0FFh ; not immediate 1609.4 001A57 link SET $ 1609.5 001A57 04 DB 4 1609.6 001A58 44554D50 DB 'DUMP' 1609.7 001A5C EVEN 1609.8 001A5C IF 'DOCOLON'='DOCODE' 1609.9 001A5C DUMP: DW $+2 1609.10 001A5C ELSE 1609.11 001A5C .... DUMP: DW DOCOLON 1609.12 001A5E ENDIF 1609.13 001A5E ENDM 1610 001A5E ............* DW OVER,PLUS,SWAP,xdo 1611 001A66 ............*LDUMP1: DW CR,II,lit,4,UDOTR,SPACE,SPACE 1612 001A74 ........1000* DW II,lit,10h,PLUS,II,xdo 1613 001A80 ............*LDUMP2: DW II,CFETCH,lit,3,UDOTR,xloop 1614 001A8C DEST LDUMP2 1614.1 001A8C F4FF DW LDUMP2-$ 1614.2 001A8E ENDM 1615 001A8E ........ DW SPACE,SPACE 1616 001A92 ........1000* DW II,lit,10h,PLUS,II,xdo 1617 001A9E ............*LDUMP3: DW II,CFETCH,lit,7Fh,ANDD,lit,7Eh,MIN,BL ANK,MAX,EMIT,xloop 1618 001AB6 DEST LDUMP3 1618.1 001AB6 E8FF DW LDUMP3-$ 1618.2 001AB8 ENDM 1619 001AB8 ....1000.... DW lit,10h,xplusloop 1620 001ABE DEST LDUMP1 1620.1 001ABE A8FF DW LDUMP1-$ 1620.2 001AC0 ENDM 1621 001AC0 .... DW EXIT 1622 001AC2 1623 001AC2 ;X .S -- print stack contents 1624 001AC2 ; [char] < EMIT DEPTH . BS [char] > EMIT 1625 001AC2 ; SP@ S0 < IF 1626 001AC2 ; SP@ S0 2 - DO I @ U. -2 +LOOP 1627 001AC2 ; THEN ; 1628 001AC2 HEADER DOTS,2,'.S',DOCOLON 1628.1 000000 PUBLIC DOTS 1628.2 001AC2 .... DW link 1628.3 001AC4 FF DB 0FFh ; not immediate 1628.4 001AC5 link SET $ 1628.5 001AC5 02 DB 2 1628.6 001AC6 2E53 DB '.S' 1628.7 001AC8 EVEN 1628.8 001AC8 IF 'DOCOLON'='DOCODE' 1628.9 001AC8 DOTS: DW $+2 1628.10 001AC8 ELSE 1628.11 001AC8 .... DOTS: DW DOCOLON 1628.12 001ACA ENDIF 1628.13 001ACA ENDM 1629 001ACA ;mk gforth style 1630 001ACA ....3C00.... DW lit,$3C,EMIT 1631 001AD0 ........ DW DEPTH,DOT 1632 001AD4 ....0800....* DW lit,$08,EMIT,lit,$3E,EMIT,SPACE - 4e-core430G2553 - Page 129 1633 001AE2 ;/mk 1634 001AE2 ............* DW SPFETCH,S0,LESS,qbran 1635 001AEA DEST DOTS2 1635.1 001AEA 1C00 DW DOTS2-$ 1635.2 001AEC ENDM 1636 001AEC ............* DW SPFETCH,S0,lit,2,MINUS 1637 001AF6 ; DW TWODUP,TOR,TOR, 1638 001AF6 .... DW xdo 1639 001AF8 ............*DOTS1: DW II,FETCH,UDOT,lit,-2,xplusloop 1640 001B04 DEST DOTS1 1640.1 001B04 F4FF DW DOTS1-$ 1640.2 001B06 ENDM 1641 001B06 ; DW lit,'|',EMIT,RFROM,RFROM 1642 001B06 ; DW xdo 1643 001B06 ;DOTS11: DW II,FETCH,UDOT,lit,-2,xplusloop 1644 001B06 ; DEST DOTS11 1645 001B06 .... DOTS2: DW EXIT 1646 001B08 1647 001B08 1648 001B08 ;U ccrc n c -- n' crc process byte 1649 001B08 ; 8 LSHIFT XOR 1650 001B08 ; 8 0 DO ( n' ) 1651 001B08 ; DUP 1 LSHIFT SWAP 8000 AND 0= INVERT 1021 ( CRC-16 ) AND XOR 1652 001B08 ; LOOP 1653 001B08 ; FFFF AND ; 1654 001B08 ; HEADER CCRC,4,'ccrc',DOCODE 1655 001B08 HEADLESS CCRC,DOCODE 1655.1 000000 PUBLIC CCRC 1655.2 001B08 IF 'DOCODE'='DOCODE' 1655.3 001B08 .... CCRC: DW $+2 1655.4 001B0A ELSE 1655.5 001B0A CCRC: DW DOCODE 1655.6 001B0A ENDIF 1655.7 001B0A ENDM 1656 001B0A 37F0FF00 AND #00FFh,TOS 1657 001B0E 8710 SWPB TOS 1658 001B10 37E4 XOR @PSP+,TOS 1659 001B12 3642 MOV #8,W 1660 001B14 0757 ccrc1: RLA TOS 1661 001B16 0228 JNC ccrc2 1662 001B18 37E02110 XOR #01021h,TOS 1663 001B1C 1683 ccrc2: DEC W 1664 001B1E FA23 JNZ ccrc1 1665 001B20 NEXT 1665.1 001B20 3645 MOV @IP+,W // ; fetch word address into W 1665.2 001B22 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 1665.3 001B24 ENDM 1666 001B24 1667 001B24 ;U crc n addr len -- n' crc process string 1668 001B24 ; dup IF over + swap DO ( n ) I C@ ccrc LOOP ELSE 2drop THEN ; 1669 001B24 HEADER CRC,3,'CRC',DOCOLON 1669.1 000000 PUBLIC CRC 1669.2 001B24 .... DW link 1669.3 001B26 FF DB 0FFh ; not immediate 1669.4 001B27 link SET $ 1669.5 001B27 03 DB 3 1669.6 001B28 435243 DB 'CRC' 1669.7 001B2B 00 EVEN 1669.8 001B2C IF 'DOCOLON'='DOCODE' 1669.9 001B2C CRC: DW $+2 1669.10 001B2C ELSE 1669.11 001B2C .... CRC: DW DOCOLON 1669.12 001B2E ENDIF 1669.13 001B2E ENDM 1670 001B2E ........ DW DUP,qbran 1671 001B32 DEST pcrc2 1671.1 001B32 1800 DW pcrc2-$ 1671.2 001B34 ENDM 1672 001B34 ............* DW OVER,PLUS,SWAP,xdo 1673 001B3C ............*pcrc1: DW II,CFETCH,CCRC, xloop 1674 001B44 DEST pcrc1 - 4e-core430G2553 - Page 130 1674.1 001B44 F8FF DW pcrc1-$ 1674.2 001B46 ENDM 1675 001B46 .... DW bran 1676 001B48 DEST pcrc3 1676.1 001B48 0400 DW pcrc3-$ 1676.2 001B4A ENDM 1677 001B4A .... pcrc2: DW TWODROP 1678 001B4C .... pcrc3: DW EXIT 1679 001B4E 1680 001B4E 1681 001B4E 1682 001B4E ;U MISC ======================================== ================================ 1683 001B4E 1684 001B4E ;C 2CONSTANT w1 w2 -- define a Forth double constant 1685 001B4E ; (machine code fragment) 1687 001B4E ; Note that the constant is stored in Code space. 1688 001B4E HEADER TWOCONSTANT,9,'2CONSTANT',DOCOLON 1688.1 000000 PUBLIC TWOCONSTANT 1688.2 001B4E .... DW link 1688.3 001B50 FF DB 0FFh ; not immediate 1688.4 001B51 link SET $ 1688.5 001B51 09 DB 9 1688.6 001B52 32434F4E5354* DB '2CONSTANT' 1688.7 001B5B 00 EVEN 1688.8 001B5C IF 'DOCOLON'='DOCODE' 1688.9 001B5C TWOCONSTANT: DW $+2 1688.10 001B5C ELSE 1688.11 001B5C .... TWOCONSTANT: DW DOCOLON 1688.12 001B5E ENDIF 1688.13 001B5E ENDM 1689 001B5E ............* DW BUILDS,ICOMMA,ICOMMA,XDOES 1690 000000 PUBLIC DOTWOCON 1691 001B66 DOTWOCON: ; ( -- w1 w2 ) 1692 001B66 2482 SUB #4,PSP ; make room on stack 1693 001B68 84470200 MOV TOS,2(PSP) 1694 001B6C 3746 MOV @W+,TOS ; fetch from parameter field to TOS 1695 001B6E A4460000 MOV @W,0(PSP) ; fetch secon word from parameter field to NOS 1696 001B72 NEXT 1696.1 001B72 3645 MOV @IP+,W // ; fetch word address into W 1696.2 001B74 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 1696.3 001B76 ENDM 1697 001B76 1698 001B76 ;U \ -- backslash 1699 001B76 ; everything up to the end of the current line is a comment. 1700 001B76 ; SOURCE >IN ! DROP ; 1701 001B76 IMMED BACKSLASH,1,'\\',DOCOLON 1701.1 000000 PUBLIC BACKSLASH 1701.2 001B76 .... DW link 1701.3 001B78 FE DB 0FEh // ; immediate (LSB=0) 1701.4 001B79 link SET $ 1701.5 001B79 01 DB 1 1701.6 001B7A 5C DB '\\' 1701.7 001B7B 00 EVEN 1701.8 001B7C IF 'DOCOLON'='DOCODE' 1701.9 001B7C BACKSLASH: DW $+2 1701.10 001B7C ELSE 1701.11 001B7C .... BACKSLASH: DW DOCOLON 1701.12 001B7E ENDIF 1701.13 001B7E ENDM 1702 001B7E ............* DW SOURCE,TOIN,STORE,DROP,EXIT 1703 001B88 1704 001B88 ;Z .VER -- type message 1705 001B88 HEADER DOTVER,4,'.VER',DOCOLON 1705.1 000000 PUBLIC DOTVER - 4e-core430G2553 - Page 131 1705.2 001B88 .... DW link 1705.3 001B8A FF DB 0FFh ; not immediate 1705.4 001B8B link SET $ 1705.5 001B8B 04 DB 4 1705.6 001B8C 2E564552 DB '.VER' 1705.7 001B90 EVEN 1705.8 001B90 IF 'DOCOLON'='DOCODE' 1705.9 001B90 DOTVER: DW $+2 1705.10 001B90 ELSE 1705.11 001B90 .... DOTVER: DW DOCOLON 1705.12 001B92 ENDIF 1705.13 001B92 ENDM 1706 001B92 ............* DW lit,version,COUNT,ITYPE ; # of version 1707 001B9A ............* DW lit,stamp,COUNT,ONEMINUS,ITYPE ; time stamp of version 1708 001BA4 .... DW DOTBOOTVERSION 1709 001BA6 .... DW SPACE 1710 001BA8 ............ DW BASE,FETCH,BIN 1711 001BAE ............* DW COR,FETCH,lit,16,ZEROUDOTR ; flags indicating reset procedure. 1712 001BB8 ........ DW BASE,STORE 1713 001BBC .... DW EXIT 1714 001BBE 1715 001BBE ;U BELL -- send $07 to Terminal 1716 001BBE HEADER BELL,4,'BELL',DOCOLON 1716.1 000000 PUBLIC BELL 1716.2 001BBE .... DW link 1716.3 001BC0 FF DB 0FFh ; not immediate 1716.4 001BC1 link SET $ 1716.5 001BC1 04 DB 4 1716.6 001BC2 42454C4C DB 'BELL' 1716.7 001BC6 EVEN 1716.8 001BC6 IF 'DOCOLON'='DOCODE' 1716.9 001BC6 BELL: DW $+2 1716.10 001BC6 ELSE 1716.11 001BC6 .... BELL: DW DOCOLON 1716.12 001BC8 ENDIF 1716.13 001BC8 ENDM 1717 001BC8 ....0700....* DW lit,7,EMIT,EXIT 1718 001BD0 1719 001BD0 ;U ESC[ -- start esc-sequence 1720 001BD0 ; 27 emit 91 emit ; 1721 001BD0 HEADERLESS ESCPAR,4,'ESC[',DOCOLON 1721.1 000000 PUBLIC ESCPAR 1721.2 001BD0 IF 'DOCOLON'='DOCODE' 1721.3 001BD0 ESCPAR: DW $+2 1721.4 001BD0 ELSE 1721.5 001BD0 .... ESCPAR: DW DOCOLON 1721.6 001BD2 ENDIF 1721.7 001BD2 ENDM 1722 001BD2 ....1B00....* DW lit,27,EMIT, lit,91,EMIT 1723 001BDE .... DW EXIT 1724 001BE0 1725 001BE0 ;U PN -- send parameter of esc-sequence 1726 001BE0 ; base @ swap decimal 0 u.r base ! ; 1727 001BE0 HEADERLESS PN,2,'PN',DOCOLON 1727.1 000000 PUBLIC PN 1727.2 001BE0 IF 'DOCOLON'='DOCODE' 1727.3 001BE0 PN: DW $+2 1727.4 001BE0 ELSE 1727.5 001BE0 .... PN: DW DOCOLON 1727.6 001BE2 ENDIF 1727.7 001BE2 ENDM 1728 001BE2 ........ DW BASE,FETCH 1729 001BE6 ............* DW SWAP,DECIMAL,ZERO,UDOTR 1730 001BEE ........ DW BASE,STORE 1731 001BF2 .... DW EXIT 1732 001BF4 1733 001BF4 ;U ;PN -- send delimiter ; followed by parameter 1734 001BF4 ; 59 emit pn ; 1735 001BF4 HEADERLESS SEMIPN,3,';PN',DOCOLON - 4e-core430G2553 - Page 132 1735.1 000000 PUBLIC SEMIPN 1735.2 001BF4 IF 'DOCOLON'='DOCODE' 1735.3 001BF4 SEMIPN: DW $+2 1735.4 001BF4 ELSE 1735.5 001BF4 .... SEMIPN: DW DOCOLON 1735.6 001BF6 ENDIF 1735.7 001BF6 ENDM 1736 001BF6 ....3B00....* DW lit,59,EMIT,PN 1737 001BFE .... DW EXIT 1738 001C00 1739 001C00 ;U AT-XY x y -- send esc-sequence to terminal 1740 001C00 ; 1+ swap 1+ swap ESC[ pn ;pn 72 emit ; 1741 001C00 HEADER ATXY,5,'AT-XY',DOCOLON 1741.1 000000 PUBLIC ATXY 1741.2 001C00 .... DW link 1741.3 001C02 FF DB 0FFh ; not immediate 1741.4 001C03 link SET $ 1741.5 001C03 05 DB 5 1741.6 001C04 41542D5859 DB 'AT-XY' 1741.7 001C09 00 EVEN 1741.8 001C0A IF 'DOCOLON'='DOCODE' 1741.9 001C0A ATXY: DW $+2 1741.10 001C0A ELSE 1741.11 001C0A .... ATXY: DW DOCOLON 1741.12 001C0C ENDIF 1741.13 001C0C ENDM 1742 001C0C ............* DW ONEPLUS,SWAP,ONEPLUS,SWAP 1743 001C14 ........ DW ESCPAR,PN 1744 001C18 ........4800* DW SEMIPN, lit,72,EMIT 1745 001C20 .... DW EXIT 1746 001C22 1747 001C22 ;U PAGE -- send "page" command to terminal to clear screen. 1748 001C22 ; esc[ ." 2J" 0 0 at-xy ; 1749 001C22 HEADER PAGEE,4,'PAGE',DOCOLON 1749.1 000000 PUBLIC PAGEE 1749.2 001C22 .... DW link 1749.3 001C24 FF DB 0FFh ; not immediate 1749.4 001C25 link SET $ 1749.5 001C25 04 DB 4 1749.6 001C26 50414745 DB 'PAGE' 1749.7 001C2A EVEN 1749.8 001C2A IF 'DOCOLON'='DOCODE' 1749.9 001C2A PAGEE: DW $+2 1749.10 001C2A ELSE 1749.11 001C2A .... PAGEE: DW DOCOLON 1749.12 001C2C ENDIF 1749.13 001C2C ENDM 1750 001C2C .... DW ESCPAR 1751 001C2E .... DW XISQUOTE 1752 001C30 03 DB (ESC1-ESC0) 1753 001C31 324A ESC0: DB '2J' 1754 001C33 00 EVEN 1755 001C34 .... ESC1: DW ITYPE 1756 001C36 ............ DW ZERO,ZERO,ATXY 1757 001C3C .... DW EXIT 1758 001C3E 1759 001C3E ;U BIN -- set number base to binary 1760 001C3E HEADER BIN,3,'BIN',DOCOLON 1760.1 000000 PUBLIC BIN 1760.2 001C3E .... DW link 1760.3 001C40 FF DB 0FFh ; not immediate 1760.4 001C41 link SET $ 1760.5 001C41 03 DB 3 1760.6 001C42 42494E DB 'BIN' 1760.7 001C45 00 EVEN 1760.8 001C46 IF 'DOCOLON'='DOCODE' 1760.9 001C46 BIN: DW $+2 1760.10 001C46 ELSE 1760.11 001C46 .... BIN: DW DOCOLON 1760.12 001C48 ENDIF 1760.13 001C48 ENDM 1761 001C48 ....0200....* DW lit,2,BASE,STORE,EXIT 1762 001C52 1763 001C52 ; ommitted, MSP430G2553 RAM is too smal. - 4e-core430G2553 - Page 133 1764 001C52 ;U RAM -- compile into RAM. SAVE your system befor using RAM. 1765 001C52 ; here unused 10 - allot idp ! ; Use COLD to swich back to flash. 1766 001C52 ; HEADER RAM,3,'RAM',DOCOLON 1767 001C52 ; DW HERE,UNUSED,lit,0x10,MINUS,ALLOT,ID P,STORE,EXIT 1768 001C52 1769 001C52 ;U TRUE -- f true flag 1770 001C52 HEADER TRUE,4,'TRUE',DOCON 1770.1 000000 PUBLIC TRUE 1770.2 001C52 .... DW link 1770.3 001C54 FF DB 0FFh ; not immediate 1770.4 001C55 link SET $ 1770.5 001C55 04 DB 4 1770.6 001C56 54525545 DB 'TRUE' 1770.7 001C5A EVEN 1770.8 001C5A IF 'DOCON'='DOCODE' 1770.9 001C5A TRUE: DW $+2 1770.10 001C5A ELSE 1770.11 001C5A .... TRUE: DW DOCON 1770.12 001C5C ENDIF 1770.13 001C5C ENDM 1771 001C5C FFFF DW 0xFFFF 1772 001C5E 1773 001C5E ;U FALSE -- f false flag 1774 001C5E HEADER FALSE,5,'FALSE',DOCON 1774.1 000000 PUBLIC FALSE 1774.2 001C5E .... DW link 1774.3 001C60 FF DB 0FFh ; not immediate 1774.4 001C61 link SET $ 1774.5 001C61 05 DB 5 1774.6 001C62 46414C5345 DB 'FALSE' 1774.7 001C67 00 EVEN 1774.8 001C68 IF 'DOCON'='DOCODE' 1774.9 001C68 FALSE: DW $+2 1774.10 001C68 ELSE 1774.11 001C68 .... FALSE: DW DOCON 1774.12 001C6A ENDIF 1774.13 001C6A ENDM 1775 001C6A 0000 DW 0x0 1776 001C6C 1777 001C6C ;C TABLE -- create an empty definition pointing to FLASH 1778 001C6C ; HEADER 1779 001C6C ; docreate ,CF code field 1780 001C6C ; IHERE I, ; store data adr (Harvard) 1781 001C6C ; Harvard model, separate Code and Data spaces. 1782 001C6C ; Separate headers model. 1783 001C6C ; or do this (4e4th): 1784 001C6C ; : TABLE @ ; 1785 001C6C HEADER TABLE,5,'TABLE',DOCOLON 1785.1 000000 PUBLIC TABLE 1785.2 001C6C .... DW link 1785.3 001C6E FF DB 0FFh ; not immediate 1785.4 001C6F link SET $ 1785.5 001C6F 05 DB 5 1785.6 001C70 5441424C45 DB 'TABLE' 1785.7 001C75 00 EVEN 1785.8 001C76 IF 'DOCOLON'='DOCODE' 1785.9 001C76 TABLE: DW $+2 1785.10 001C76 ELSE 1785.11 001C76 .... TABLE: DW DOCOLON 1785.12 001C78 ENDIF 1785.13 001C78 ENDM 1786 001C78 .... DW HEADR 1787 001C7A ............ DW lit,docreate,COMMACF 1788 001C80 ............* DW IHERE,CELL,PLUS,ICOMMA,EXIT 1789 001C8A 1790 001C8A 1791 001C8A 1792 001C8A ;U MCU specific words ========================== ================================ 1793 001C8A 1794 001C8A /* - 4e-core430G2553 - Page 134 1795 001C8A ; .ID -- Print MCU identifier. 1796 001C8A HEADER DOTID,3,'.ID',DOCOLON 1797 001C8A DW lit,id,COUNT,ITYPE 1798 001C8A DW EXIT 1799 001C8A */ 1800 001C8A 1801 001C8A ;U 1MS -- wait about 1 millisecond 1802 001C8A ; xx 0 DO yy 0 DO LOOP LOOP ; adjust xx and yy to get a msec. 1803 001C8A HEADER ONEMS,3,'1MS',DOCOLON 1803.1 000000 PUBLIC ONEMS 1803.2 001C8A .... DW link 1803.3 001C8C FF DB 0FFh ; not immediate 1803.4 001C8D link SET $ 1803.5 001C8D 03 DB 3 1803.6 001C8E 314D53 DB '1MS' 1803.7 001C91 00 EVEN 1803.8 001C92 IF 'DOCOLON'='DOCODE' 1803.9 001C92 ONEMS: DW $+2 1803.10 001C92 ELSE 1803.11 001C92 .... ONEMS: DW DOCOLON 1803.12 001C94 ENDIF 1803.13 001C94 ENDM 1804 001C94 ....2900....* DW lit,41,ZERO,xdo 1805 001C9C ....0B00....*onems1: DW lit,11,ZERO,xdo 1806 001CA4 .... onems2: DW xloop 1807 001CA6 DEST onems2 1807.1 001CA6 FEFF DW onems2-$ 1807.2 001CA8 ENDM 1808 001CA8 .... DW xloop 1809 001CAA DEST onems1 1809.1 001CAA F2FF DW onems1-$ 1809.2 001CAC ENDM 1810 001CAC .... DW EXIT 1811 001CAE 1812 001CAE ;U MS n -- wait about n milliseconds 1813 001CAE ; 0 DO 1MS LOOP ; 1814 001CAE HEADER MS,2,'MS',DOCOLON 1814.1 000000 PUBLIC MS 1814.2 001CAE .... DW link 1814.3 001CB0 FF DB 0FFh ; not immediate 1814.4 001CB1 link SET $ 1814.5 001CB1 02 DB 2 1814.6 001CB2 4D53 DB 'MS' 1814.7 001CB4 EVEN 1814.8 001CB4 IF 'DOCOLON'='DOCODE' 1814.9 001CB4 MS: DW $+2 1814.10 001CB4 ELSE 1814.11 001CB4 .... MS: DW DOCOLON 1814.12 001CB6 ENDIF 1814.13 001CB6 ENDM 1815 001CB6 ........ DW ZERO,xdo 1816 001CBA ........ ms1: DW ONEMS,xloop 1817 001CBE DEST ms1 1817.1 001CBE FCFF DW ms1-$ 1817.2 001CC0 ENDM 1818 001CC0 .... DW EXIT 1819 001CC2 1820 001CC2 1821 001CC2 ;U Bit manipulation words ---------------------- -------------------------------- 1822 001CC2 ; based on http://www.forth.org/svfig/Len/bits. htm 1823 001CC2 1824 001CC2 ;U SET mask addr -- set bit from mask in addr (cell); use even adr! 1825 001CC2 HEADER wset,3,'SET',DOCODE 1825.1 000000 PUBLIC wset 1825.2 001CC2 .... DW link 1825.3 001CC4 FF DB 0FFh ; not immediate 1825.4 001CC5 link SET $ 1825.5 001CC5 03 DB 3 1825.6 001CC6 534554 DB 'SET' 1825.7 001CC9 00 EVEN 1825.8 001CCA IF 'DOCODE'='DOCODE' 1825.9 001CCA .... wset: DW $+2 - 4e-core430G2553 - Page 135 1825.10 001CCC ELSE 1825.11 001CCC wset: DW DOCODE 1825.12 001CCC ENDIF 1825.13 001CCC ENDM 1826 001CCC A7D40000 BIS @PSP,0(TOS) 1827 001CD0 2453 ADD #2,PSP 1828 001CD2 3744 MOV @PSP+,TOS 1829 001CD4 NEXT 1829.1 001CD4 3645 MOV @IP+,W // ; fetch word address into W 1829.2 001CD6 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 1829.3 001CD8 ENDM 1830 001CD8 1831 001CD8 ;U CSET mask addr -- set bit from mask in addr (byte) 1832 001CD8 HEADER cset,4,'CSET',DOCODE 1832.1 000000 PUBLIC cset 1832.2 001CD8 .... DW link 1832.3 001CDA FF DB 0FFh ; not immediate 1832.4 001CDB link SET $ 1832.5 001CDB 04 DB 4 1832.6 001CDC 43534554 DB 'CSET' 1832.7 001CE0 EVEN 1832.8 001CE0 IF 'DOCODE'='DOCODE' 1832.9 001CE0 .... cset: DW $+2 1832.10 001CE2 ELSE 1832.11 001CE2 cset: DW DOCODE 1832.12 001CE2 ENDIF 1832.13 001CE2 ENDM 1833 001CE2 E7D40000 BIS.B @PSP,0(TOS) 1834 001CE6 2453 ADD #2,PSP 1835 001CE8 3744 MOV @PSP+,TOS 1836 001CEA NEXT 1836.1 001CEA 3645 MOV @IP+,W // ; fetch word address into W 1836.2 001CEC 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 1836.3 001CEE ENDM 1837 001CEE 1838 001CEE ;U CLR mask addr -- reset bit from mask in addr (cell); use even adr! 1839 001CEE HEADER wclr,3,'CLR',DOCODE 1839.1 000000 PUBLIC wclr 1839.2 001CEE .... DW link 1839.3 001CF0 FF DB 0FFh ; not immediate 1839.4 001CF1 link SET $ 1839.5 001CF1 03 DB 3 1839.6 001CF2 434C52 DB 'CLR' 1839.7 001CF5 00 EVEN 1839.8 001CF6 IF 'DOCODE'='DOCODE' 1839.9 001CF6 .... wclr: DW $+2 1839.10 001CF8 ELSE 1839.11 001CF8 wclr: DW DOCODE 1839.12 001CF8 ENDIF 1839.13 001CF8 ENDM 1840 001CF8 A7C40000 BIC @PSP,0(TOS) 1841 001CFC 2453 ADD #2,PSP 1842 001CFE 3744 MOV @PSP+,TOS 1843 001D00 NEXT 1843.1 001D00 3645 MOV @IP+,W // ; fetch word address into W 1843.2 001D02 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 1843.3 001D04 ENDM 1844 001D04 1845 001D04 ;U CCLR mask addr -- reset bit from mask in addr (byte) 1846 001D04 HEADER cclr,4,'CCLR',DOCODE 1846.1 000000 PUBLIC cclr 1846.2 001D04 .... DW link 1846.3 001D06 FF DB 0FFh ; not immediate 1846.4 001D07 link SET $ 1846.5 001D07 04 DB 4 1846.6 001D08 43434C52 DB 'CCLR' 1846.7 001D0C EVEN 1846.8 001D0C IF 'DOCODE'='DOCODE' 1846.9 001D0C .... cclr: DW $+2 - 4e-core430G2553 - Page 136 1846.10 001D0E ELSE 1846.11 001D0E cclr: DW DOCODE 1846.12 001D0E ENDIF 1846.13 001D0E ENDM 1847 001D0E E7C40000 BIC.B @PSP,0(TOS) 1848 001D12 2453 ADD #2,PSP 1849 001D14 3744 MOV @PSP+,TOS 1850 001D16 NEXT 1850.1 001D16 3645 MOV @IP+,W // ; fetch word address into W 1850.2 001D18 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 1850.3 001D1A ENDM 1851 001D1A 1852 001D1A ;U CTOGGLE mask addr -- flip bit from mask in addr (byte) 1853 001D1A HEADER ctoggle,7,'CTOGGLE',DOCODE 1853.1 000000 PUBLIC ctoggle 1853.2 001D1A .... DW link 1853.3 001D1C FF DB 0FFh ; not immediate 1853.4 001D1D link SET $ 1853.5 001D1D 07 DB 7 1853.6 001D1E 43544F47474C* DB 'CTOGGLE' 1853.7 001D25 00 EVEN 1853.8 001D26 IF 'DOCODE'='DOCODE' 1853.9 001D26 .... ctoggle: DW $+2 1853.10 001D28 ELSE 1853.11 001D28 ctoggle: DW DOCODE 1853.12 001D28 ENDIF 1853.13 001D28 ENDM 1854 001D28 E7E40000 XOR.B @PSP,0(TOS) 1855 001D2C 2453 ADD #2,PSP 1856 001D2E 3744 MOV @PSP+,TOS 1857 001D30 NEXT 1857.1 001D30 3645 MOV @IP+,W // ; fetch word address into W 1857.2 001D32 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 1857.3 001D34 ENDM 1858 001D34 1859 001D34 ;U CGET mask addr -- flag test bit from mask in addr (byte) 1860 001D34 HEADER cget,4,'CGET',DOCODE 1860.1 000000 PUBLIC cget 1860.2 001D34 .... DW link 1860.3 001D36 FF DB 0FFh ; not immediate 1860.4 001D37 link SET $ 1860.5 001D37 04 DB 4 1860.6 001D38 43474554 DB 'CGET' 1860.7 001D3C EVEN 1860.8 001D3C IF 'DOCODE'='DOCODE' 1860.9 001D3C .... cget: DW $+2 1860.10 001D3E ELSE 1860.11 001D3E cget: DW DOCODE 1860.12 001D3E ENDIF 1860.13 001D3E ENDM 1861 001D3E E7B40000 BIT.B @PSP,0(TOS) 1862 001D42 0224 JZ cget1 1863 001D44 3743 MOV #-1,TOS 1864 001D46 013C JMP cget2 1865 001D48 0743 cget1:MOV #0, TOS 1866 001D4A 2453 cget2:ADD #2,PSP 1867 001D4C NEXT 1867.1 001D4C 3645 MOV @IP+,W // ; fetch word address into W 1867.2 001D4E 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 1867.3 001D50 ENDM 1868 001D50 1869 001D50 1870 001D50 ;U Memory info --------------------------------- -------------------------------- 1871 001D50 1872 001D50 /* see also: XLINK configuration file for MSP430G2553 1873 001D50 ram =: 0200-03FF 1874 001D50 0200-03C9 forth system; userarea, stacks, tib, pad ... - 4e-core430G2553 - Page 137 1875 001D50 03CA-03FF VARAREA for forth variables; check UNUSED ram. 1876 001D50 1877 001D50 flash =: C000-FFFF 1878 001D50 C000-D7FF MEMBOT to MEMTOP is user flash. Check unsused MEM. 1879 001D50 D800-FDFF kernel 1880 001D50 FE00-FFFF INTSEG 1881 001D50 FFE0-FFFF INTVEC 1882 001D50 FFFE-FFFF RESET 1883 001D50 */ 1884 001D50 1885 001D50 ;Z RESETADR -- adr reset vector address 1886 001D50 HEADER RESETADR,8,'RESETADR',DOCON 1886.1 000000 PUBLIC RESETADR 1886.2 001D50 .... DW link 1886.3 001D52 FF DB 0FFh ; not immediate 1886.4 001D53 link SET $ 1886.5 001D53 08 DB 8 1886.6 001D54 524553455441* DB 'RESETADR' 1886.7 001D5C EVEN 1886.8 001D5C IF 'DOCON'='DOCODE' 1886.9 001D5C RESETADR: DW $+2 1886.10 001D5C ELSE 1886.11 001D5C .... RESETADR: DW DOCON 1886.12 001D5E ENDIF 1886.13 001D5E ENDM 1887 001D5E .... DW resetvec 1888 001D60 1889 001D60 ;Z MEMBOT -- adr begining of USERflash 1890 001D60 HEADER MEMBOT,6,'MEMBOT',DOCON 1890.1 000000 PUBLIC MEMBOT 1890.2 001D60 .... DW link 1890.3 001D62 FF DB 0FFh ; not immediate 1890.4 001D63 link SET $ 1890.5 001D63 06 DB 6 1890.6 001D64 4D454D424F54 DB 'MEMBOT' 1890.7 001D6A EVEN 1890.8 001D6A IF 'DOCON'='DOCODE' 1890.9 001D6A MEMBOT: DW $+2 1890.10 001D6A ELSE 1890.11 001D6A .... MEMBOT: DW DOCON 1890.12 001D6C ENDIF 1890.13 001D6C ENDM 1891 001D6C 00C0 DW USERFLASHSTART 1892 001D6E 1893 001D6E ;Z MEMTOP -- adr end of USERflash 1894 001D6E HEADER MEMTOP,6,'MEMTOP',DOCON 1894.1 000000 PUBLIC MEMTOP 1894.2 001D6E .... DW link 1894.3 001D70 FF DB 0FFh ; not immediate 1894.4 001D71 link SET $ 1894.5 001D71 06 DB 6 1894.6 001D72 4D454D544F50 DB 'MEMTOP' 1894.7 001D78 EVEN 1894.8 001D78 IF 'DOCON'='DOCODE' 1894.9 001D78 MEMTOP: DW $+2 1894.10 001D78 ELSE 1894.11 001D78 .... MEMTOP: DW DOCON 1894.12 001D7A ENDIF 1894.13 001D7A ENDM 1895 001D7A FFD7 DW USERFLASHEND 1896 001D7C 1897 001D7C ;U MEM -- u bytes left in flash 1898 001D7C ; memtop ihere - ; 1899 001D7C HEADER MEM,3,'MEM',DOCOLON 1899.1 000000 PUBLIC MEM 1899.2 001D7C .... DW link 1899.3 001D7E FF DB 0FFh ; not immediate 1899.4 001D7F link SET $ 1899.5 001D7F 03 DB 3 1899.6 001D80 4D454D DB 'MEM' 1899.7 001D83 00 EVEN 1899.8 001D84 IF 'DOCOLON'='DOCODE' 1899.9 001D84 MEM: DW $+2 - 4e-core430G2553 - Page 138 1899.10 001D84 ELSE 1899.11 001D84 .... MEM: DW DOCOLON 1899.12 001D86 ENDIF 1899.13 001D86 ENDM 1900 001D86 ............ DW MEMTOP,IHERE,MINUS 1901 001D8C .... DW EXIT 1902 001D8E 1903 001D8E ;U UNUSED -- u bytes left in RAM 1904 001D8E HEADER UNUSED,6,'UNUSED',DOCOLON 1904.1 000000 PUBLIC UNUSED 1904.2 001D8E .... DW link 1904.3 001D90 FF DB 0FFh ; not immediate 1904.4 001D91 link SET $ 1904.5 001D91 06 DB 6 1904.6 001D92 554E55534544 DB 'UNUSED' 1904.7 001D98 EVEN 1904.8 001D98 IF 'DOCOLON'='DOCODE' 1904.9 001D98 UNUSED: DW $+2 1904.10 001D98 ELSE 1904.11 001D98 .... UNUSED: DW DOCOLON 1904.12 001D9A ENDIF 1904.13 001D9A ENDM 1905 001D9A ....0004....* DW lit,RAMEND,HERE,MINUS 1906 001DA2 .... DW EXIT 1907 001DA4 1908 001DA4 ;Z VARBOT -- a-addr bottom of Variable Area 1909 001DA4 HEADER VARBOT,6,'VARBOT',DOCON 1909.1 000000 PUBLIC VARBOT 1909.2 001DA4 .... DW link 1909.3 001DA6 FF DB 0FFh ; not immediate 1909.4 001DA7 link SET $ 1909.5 001DA7 06 DB 6 1909.6 001DA8 564152424F54 DB 'VARBOT' 1909.7 001DAE EVEN 1909.8 001DAE IF 'DOCON'='DOCODE' 1909.9 001DAE VARBOT: DW $+2 1909.10 001DAE ELSE 1909.11 001DAE .... VARBOT: DW DOCON 1909.12 001DB0 ENDIF 1909.13 001DB0 ENDM 1910 001DB0 .... DW VARAREA 1911 001DB2 1912 000000 EXTERN intseg,intvecs 1913 001DB2 ;Z TOPSEG -- a-addr bottom of top most segment 1914 001DB2 HEADER TOPSEG,6,'TOPSEG',DOCON 1914.1 000000 PUBLIC TOPSEG 1914.2 001DB2 .... DW link 1914.3 001DB4 FF DB 0FFh ; not immediate 1914.4 001DB5 link SET $ 1914.5 001DB5 06 DB 6 1914.6 001DB6 544F50534547 DB 'TOPSEG' 1914.7 001DBC EVEN 1914.8 001DBC IF 'DOCON'='DOCODE' 1914.9 001DBC TOPSEG: DW $+2 1914.10 001DBC ELSE 1914.11 001DBC .... TOPSEG: DW DOCON 1914.12 001DBE ENDIF 1914.13 001DBE ENDM 1915 001DBE .... DW intseg 1916 001DC0 1917 001DC0 ;Z VECBOT -- a-addr begining of vector segment 1918 001DC0 HEADER VECBOT,6,'VECBOT',DOCON 1918.1 000000 PUBLIC VECBOT 1918.2 001DC0 .... DW link 1918.3 001DC2 FF DB 0FFh ; not immediate 1918.4 001DC3 link SET $ 1918.5 001DC3 06 DB 6 1918.6 001DC4 564543424F54 DB 'VECBOT' 1918.7 001DCA EVEN 1918.8 001DCA IF 'DOCON'='DOCODE' 1918.9 001DCA VECBOT: DW $+2 1918.10 001DCA ELSE 1918.11 001DCA .... VECBOT: DW DOCON 1918.12 001DCC ENDIF 1918.13 001DCC ENDM - 4e-core430G2553 - Page 139 1919 001DCC .... DW intvecs 1920 001DCE 1921 001DCE 1922 001DCE ;U ? adr -- u display content of variable 1923 001DCE ; @ u. ; 1924 001DCE HEADER QQ,1,'?',DOCOLON 1924.1 000000 PUBLIC QQ 1924.2 001DCE .... DW link 1924.3 001DD0 FF DB 0FFh ; not immediate 1924.4 001DD1 link SET $ 1924.5 001DD1 01 DB 1 1924.6 001DD2 3F DB '?' 1924.7 001DD3 00 EVEN 1924.8 001DD4 IF 'DOCOLON'='DOCODE' 1924.9 001DD4 QQ: DW $+2 1924.10 001DD4 ELSE 1924.11 001DD4 .... QQ: DW DOCOLON 1924.12 001DD6 ENDIF 1924.13 001DD6 ENDM 1925 001DD6 ........ DW FETCH,UDOT 1926 001DDA .... DW EXIT 1927 001DDC 1928 001DDC 1929 001DDC ;U MCU Peripherie ------------------------------ -------------------------------- 1930 001DDC 1931 001DDC ;Z P1 -- adr address of port1 output register 1932 001DDC HEADER P1,2,'P1',DOCON 1932.1 000000 PUBLIC P1 1932.2 001DDC .... DW link 1932.3 001DDE FF DB 0FFh ; not immediate 1932.4 001DDF link SET $ 1932.5 001DDF 02 DB 2 1932.6 001DE0 5031 DB 'P1' 1932.7 001DE2 EVEN 1932.8 001DE2 IF 'DOCON'='DOCODE' 1932.9 001DE2 P1: DW $+2 1932.10 001DE2 ELSE 1932.11 001DE2 .... P1: DW DOCON 1932.12 001DE4 ENDIF 1932.13 001DE4 ENDM 1933 001DE4 2100 DW P1OUT 1934 001DE6 1935 001DE6 ;Z P2 -- adr address of port2 output register 1936 001DE6 HEADER P2,2,'P2',DOCON 1936.1 000000 PUBLIC P2 1936.2 001DE6 .... DW link 1936.3 001DE8 FF DB 0FFh ; not immediate 1936.4 001DE9 link SET $ 1936.5 001DE9 02 DB 2 1936.6 001DEA 5032 DB 'P2' 1936.7 001DEC EVEN 1936.8 001DEC IF 'DOCON'='DOCODE' 1936.9 001DEC P2: DW $+2 1936.10 001DEC ELSE 1936.11 001DEC .... P2: DW DOCON 1936.12 001DEE ENDIF 1936.13 001DEE ENDM 1937 001DEE 2900 DW P2OUT 1938 001DF0 1939 001DF0 ;Z P3 -- adr address of port2 output register 1940 001DF0 HEADER P3,2,'P3',DOCON 1940.1 000000 PUBLIC P3 1940.2 001DF0 .... DW link 1940.3 001DF2 FF DB 0FFh ; not immediate 1940.4 001DF3 link SET $ 1940.5 001DF3 02 DB 2 1940.6 001DF4 5033 DB 'P3' 1940.7 001DF6 EVEN 1940.8 001DF6 IF 'DOCON'='DOCODE' 1940.9 001DF6 P3: DW $+2 1940.10 001DF6 ELSE 1940.11 001DF6 .... P3: DW DOCON 1940.12 001DF8 ENDIF - 4e-core430G2553 - Page 140 1940.13 001DF8 ENDM 1941 001DF8 1900 DW P3OUT 1942 001DFA 1943 001DFA ; Note: the first character sent from the MSP430 seems to get 1944 001DFA ; scrambled. I conjecture this is because the baud rate generator 1945 001DFA ; has not reset to the new rate when we attempt to send a character. 1946 001DFA ; See init430f1611.s43 for delay after initialization. 1947 001DFA 1948 001DFA 1949 001DFA ;U Basics for an extern cross assembler ---------------------------------------- 1950 001DFA ; Usage of CODE and NEXT see top of file. 1951 001DFA 1952 001DFA ;U CODE -- build header for assembler word, 1953 001DFA ; execute code at runtime. 1954 001DFA ; -- build constant 1960 001E14 ; -- adr at runtime put address of next cell on stack, 1961 001E14 ; thats where your code starts. 1962 001E14 ; ; 1963 001E14 HEADER CODEADR,7,'CODEADR',DOCOLON 1963.1 000000 PUBLIC CODEADR 1963.2 001E14 .... DW link 1963.3 001E16 FF DB 0FFh ; not immediate 1963.4 001E17 link SET $ 1963.5 001E17 07 DB 7 1963.6 001E18 434F44454144* DB 'CODEADR' 1963.7 001E1F 00 EVEN 1963.8 001E20 IF 'DOCOLON'='DOCODE' 1963.9 001E20 CODEADR: DW $+2 1963.10 001E20 ELSE 1963.11 001E20 .... CODEADR: DW DOCOLON 1963.12 001E22 ENDIF 1963.13 001E22 ENDM 1964 001E22 ........ DW BUILDS,XDOES ; build forth word 1965 001E26 3040.... MOV #DOROM,PC ; push ihere to TOS 1966 001E2A 1967 001E2A ;U CALL adr -- run a code subroutine starting at address. 1968 001E2A HEADER CALLL,4,'CALL',DOCODE 1968.1 000000 PUBLIC CALLL 1968.2 001E2A .... DW link 1968.3 001E2C FF DB 0FFh ; not immediate 1968.4 001E2D link SET $ 1968.5 001E2D 04 DB 4 1968.6 001E2E 43414C4C DB 'CALL' 1968.7 001E32 EVEN 1968.8 001E32 IF 'DOCODE'='DOCODE' 1968.9 001E32 .... CALLL: DW $+2 1968.10 001E34 ELSE 1968.11 001E34 CALLL: DW DOCODE - 4e-core430G2553 - Page 141 1968.12 001E34 ENDIF 1968.13 001E34 ENDM 1969 001E34 8712 CALL TOS 1970 001E36 next 1970.1 001E36 3645 MOV @IP+,W // ; fetch word address into W 1970.2 001E38 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 1970.3 001E3A ENDM 1971 001E3A 1972 001E3A /* 1973 001E3A ;U NEXT, -- Macro; compiles jump to high level forth 1974 001E3A ; hex : next 4536 i, 4630 i, ; 1975 001E3A HEADER NEXTCOMA,5,'NEXT,',DOCOLON 1976 001E3A DW lit,4536h,ICOMMA,lit,4630h,ICOMMA 1977 001E3A DW EXIT 1978 001E3A */ 1979 001E3A 1980 001E3A ;U END-CODE -- mark end of code section 1981 001E3A ; ; 1982 001E3A HEADER ENDCODE,8,'END-CODE',DOCOLON 1982.1 000000 PUBLIC ENDCODE 1982.2 001E3A .... DW link 1982.3 001E3C FF DB 0FFh ; not immediate 1982.4 001E3D link SET $ 1982.5 001E3D 08 DB 8 1982.6 001E3E 454E442D434F* DB 'END-CODE' 1982.7 001E46 EVEN 1982.8 001E46 IF 'DOCOLON'='DOCODE' 1982.9 001E46 ENDCODE: DW $+2 1982.10 001E46 ELSE 1982.11 001E46 .... ENDCODE: DW DOCOLON 1982.12 001E48 ENDIF 1982.13 001E48 ENDM 1983 001E48 .... DW EXIT ; dummy - used as delimiter in 4e4th-IDE to generate code 1984 001E4A 1985 001E4A 1986 001E4A /*********************************************** ******************************** 1987 001E4A ; copy&paste to 4e4th: 1988 001E4A 1989 001E4A \ Code example: 1990 001E4A hex 1991 001E4A CODE REDOFF C3D2 I, 0021 I, NEXT, END-CODE 1992 001E4A CODE REDON D3D2 I, 0021 I, NEXT, END-CODE 1993 001E4A 1994 001E4A \ now run your words: 1995 001E4A REDOFF 1000 ms REDON 1996 001E4A 1997 001E4A ************************************************ *******************************/ 1998 001E4A 1999 001E4A ; EOF 987 001E4A #include "4e-startup.s43" 1 001E4A ;U STARTUP WORDS =============================== ================================ 2 001E4A 3 001E4A ;U .BOOTVERSION -- print boot version 4 001E4A HEADLESS DOTBOOTVERSION,DOCOLON 4.1 000000 PUBLIC DOTBOOTVERSION 4.2 001E4A IF 'DOCOLON'='DOCODE' 4.3 001E4A DOTBOOTVERSION: DW $+2 4.4 001E4A ELSE 4.5 001E4A .... DOTBOOTVERSION: DW DOCOLON 4.6 001E4C ENDIF 4.7 001E4C ENDM 5 001E4C .... DW XISQUOTE 6 001E4E 07 DB (doboot1-doboot0) 7 001E4F 206465627567*doboot0: DB ' debug ' 8 001E56 EVEN 9 001E56 .... doboot1: DW ITYPE - 4e-core430G2553 - Page 142 10 001E58 .... DW EXIT 11 001E5A 12 001E5A ;Z ITHERE -- adr find first free flash cell 13 001E5A ; MEMTOP BEGIN 1- 14 001E5A ; DUP C@ FF <> 15 001E5A ; OVER FL0 < OR UNTIL 1+ ; 16 001E5A HEADER ITHERE,6,'ITHERE',DOCOLON 16.1 000000 PUBLIC ITHERE 16.2 001E5A .... DW link 16.3 001E5C FF DB 0FFh ; not immediate 16.4 001E5D link SET $ 16.5 001E5D 06 DB 6 16.6 001E5E 495448455245 DB 'ITHERE' 16.7 001E64 EVEN 16.8 001E64 IF 'DOCOLON'='DOCODE' 16.9 001E64 ITHERE: DW $+2 16.10 001E64 ELSE 16.11 001E64 .... ITHERE: DW DOCOLON 16.12 001E66 ENDIF 16.13 001E66 ENDM 17 001E66 .... DW MEMTOP 18 001E68 ............*ih1 DW ONEMINUS,DUP,CFETCH,lit,$FF,NOTEQUAL 19 001E74 ............* DW OVER,MEMBOT,LESS,ORR,qbran 20 001E7E DEST ih1 20.1 001E7E EAFF DW ih1-$ 20.2 001E80 ENDM 21 001E80 ........ DW ONEPLUS,EXIT 22 001E84 23 001E84 ;U APPCRC -- crc CRC of APP-dictionary 24 001E84 ; 0 MEMBOT ITHERE OVER - (crc APPU0 #INIT (crc ; 25 001E84 ; HEADER APPCRC,6,'APPCRC',DOCOLON 26 001E84 HEADLESS APPCRC,DOCOLON 26.1 000000 PUBLIC APPCRC 26.2 001E84 IF 'DOCOLON'='DOCODE' 26.3 001E84 APPCRC: DW $+2 26.4 001E84 ELSE 26.5 001E84 .... APPCRC: DW DOCOLON 26.6 001E86 ENDIF 26.7 001E86 ENDM 27 001E86 ....0000 DW lit,0 28 001E8A ............* DW MEMBOT,ITHERE,OVER,MINUS,CRC 29 001E94 ............* DW APPU0,NINIT,CRC,EXIT 30 001E9C 31 000000 EXTERN crcval 32 001E9C 33 001E9C ;U VALID? -- f check if user app crc matches infoB 34 001E9C ; APPCRC crcval I@ = ; 35 001E9C ; HEADER VALIDQ,6,'VALID?',DOCOLON 36 001E9C HEADLESS VALIDQ,DOCOLON 36.1 000000 PUBLIC VALIDQ 36.2 001E9C IF 'DOCOLON'='DOCODE' 36.3 001E9C VALIDQ: DW $+2 36.4 001E9C ELSE 36.5 001E9C .... VALIDQ: DW DOCOLON 36.6 001E9E ENDIF 36.7 001E9E ENDM 37 001E9E ............* DW APPCRC,lit,crcval,IFETCH,EQUAL,EXIT 38 001EAA 39 001EAA ;U SAVE -- save user area to infoB 40 001EAA ; InfoB [ 63 2 + ] Literal FLERASE 41 001EAA ; U0 APPU0 #INIT D->I 42 001EAA ; APPCRC [ crcval ] Literal I! ; 43 001EAA HEADER SAVE,4,'SAVE',DOCOLON 43.1 000000 PUBLIC SAVE 43.2 001EAA .... DW link 43.3 001EAC FF DB 0FFh ; not immediate 43.4 001EAD link SET $ 43.5 001EAD 04 DB 4 43.6 001EAE 53415645 DB 'SAVE' 43.7 001EB2 EVEN 43.8 001EB2 IF 'DOCOLON'='DOCODE' 43.9 001EB2 SAVE: DW $+2 43.10 001EB2 ELSE 43.11 001EB2 .... SAVE: DW DOCOLON 43.12 001EB4 ENDIF - 4e-core430G2553 - Page 143 43.13 001EB4 ENDM 44 001EB4 ; save user area to infoB 45 001EB4 ........4100* DW INFOB,lit,63+2,FLERASE 46 001EBC ............* DW U0,APPU0,NINIT,DTOI 47 001EC4 ............* DW APPCRC,lit,crcval,ISTORE 48 001ECC ; save variable area to infoC 49 001ECC ........4100* DW INFOC,lit,63+2,FLERASE 50 001ED4 ............* DW HERE,UNUSED,ZERO,FILL 51 001EDC ............* DW VARBOT,INFOC,lit,(VAR_SIZE)*2,DTOI 52 001EE6 .... DW EXIT 53 001EE8 54 00018E CORREST EQU 018Eh 55 000186 CORPOWERON EQU 0186h 56 001EE8 57 001EE8 ;Z BOOT -- boot system 58 001EE8 HEADER BOOT,4,'BOOT',DOCOLON 58.1 000000 PUBLIC BOOT 58.2 001EE8 .... DW link 58.3 001EEA FF DB 0FFh ; not immediate 58.4 001EEB link SET $ 58.5 001EEB 04 DB 4 58.6 001EEC 424F4F54 DB 'BOOT' 58.7 001EF0 EVEN 58.8 001EF0 IF 'DOCOLON'='DOCODE' 58.9 001EF0 BOOT: DW $+2 58.10 001EF0 ELSE 58.11 001EF0 .... BOOT: DW DOCOLON 58.12 001EF2 ENDIF 58.13 001EF2 ENDM 59 001EF2 ............ DW S2,cget,qbran 60 001EF8 DEST boot1 60.1 001EF8 2800 DW boot1-$ 60.2 001EFA ENDM 61 001EFA ........ DW VALIDQ,qbran 62 001EFE DEST invalid 62.1 001EFE 0400 DW invalid-$ 62.2 001F00 ENDM 63 001F00 .... valid: DW COLD ; valid infoB and dictionary 64 001F02 ............*invalid:DW COR,FETCH,lit,CORPOWERON,NOTEQUAL,qbr an 65 001F0E DEST boot1 65.1 001F0E 1200 DW boot1-$ 65.2 001F10 ENDM 66 001F10 reset1: ; reset and invalid infoB 67 001F10 ............* DW LATEST,FETCH,MEMBOT,ITHERE,WITHIN,qbr an ; check RAM latest 68 001F1C DEST boot1 68.1 001F1C 0400 DW boot1-$ 68.2 001F1E ENDM 69 001F1E .... DW WARM ; invalid infoB but seemingly valid RAM 70 001F20 .... boot1: DW WIPE ; invalid infoB but power on or RAM invalid 71 001F22 72 000000 PUBLIC BOOTIP ; used to init IP register. 73 001F22 BOOTIP equ BOOT+2 74 001F22 75 001F22 ;Z WARM -- use user area from RAM (hopefully intact) 76 001F22 HEADER WARM,4,'WARM',DOCOLON 76.1 000000 PUBLIC WARM 76.2 001F22 .... DW link 76.3 001F24 FF DB 0FFh ; not immediate 76.4 001F25 link SET $ 76.5 001F25 04 DB 4 76.6 001F26 5741524D DB 'WARM' 76.7 001F2A EVEN 76.8 001F2A IF 'DOCOLON'='DOCODE' 76.9 001F2A WARM: DW $+2 76.10 001F2A ELSE 76.11 001F2A .... WARM: DW DOCOLON 76.12 001F2C ENDIF 76.13 001F2C ENDM 77 001F2C .... DW XISQUOTE 78 001F2E 05 DB (warm1-warm0) 79 001F2F 5761726D warm0: DB 'Warm' 80 001F33 00 EVEN - 4e-core430G2553 - Page 144 81 001F34 .... warm1: DW ITYPE 82 001F36 .... DW ABORT 83 001F38 84 001F38 ;U .COLD -- display COLD message 85 001F38 HEADLESS DOTCOLD,DOCOLON 85.1 000000 PUBLIC DOTCOLD 85.2 001F38 IF 'DOCOLON'='DOCODE' 85.3 001F38 DOTCOLD: DW $+2 85.4 001F38 ELSE 85.5 001F38 .... DOTCOLD: DW DOCOLON 85.6 001F3A ENDIF 85.7 001F3A ENDM 86 001F3A .... DW XISQUOTE 87 001F3C 05 DB (dotcold1-dotcold0) 88 001F3D 436F6C64 dotcold0:DB 'Cold' 89 001F41 00 EVEN 90 001F42 .... dotcold1:DW ITYPE 91 001F44 .... DW EXIT 92 001F46 93 001F46 PUBLIC DOTCOLD 94 001F46 95 001F46 ;Z COLD -- set user area to latest application 96 001F46 HEADER COLD,4,'COLD',DOCOLON 96.1 000000 PUBLIC COLD 96.2 001F46 .... DW link 96.3 001F48 FF DB 0FFh ; not immediate 96.4 001F49 link SET $ 96.5 001F49 04 DB 4 96.6 001F4A 434F4C44 DB 'COLD' 96.7 001F4E EVEN 96.8 001F4E IF 'DOCOLON'='DOCODE' 96.9 001F4E COLD: DW $+2 96.10 001F4E ELSE 96.11 001F4E .... COLD: DW DOCOLON 96.12 001F50 ENDIF 96.13 001F50 ENDM 97 001F50 ............* DW APPU0,U0,NINIT,ITOD ; use application user area 98 001F58 ............* DW INFOC,VARBOT,lit,0x20,ITOD ; use applicatio n variable area 99 001F62 ............ DW APP,FETCH,EXECUTE ; AUTOSTART Application 100 001F68 .... DW ABORT 101 001F6A 102 000000 PUBLIC COLDIP ; used to init IP register while testing. 103 001F6A COLDIP equ COLD+2 104 001F6A 105 001F6A ;Z FACTORY -- set user area to plain kernel 106 001F6A ; UINIT U0 #INIT I->D SAVE init user area 107 001F6A ; ABORT ; 108 001F6A HEADER FACTORY,7,'FACTORY',DOCOLON 108.1 000000 PUBLIC FACTORY 108.2 001F6A .... DW link 108.3 001F6C FF DB 0FFh ; not immediate 108.4 001F6D link SET $ 108.5 001F6D 07 DB 7 108.6 001F6E 464143544F52* DB 'FACTORY' 108.7 001F75 00 EVEN 108.8 001F76 IF 'DOCOLON'='DOCODE' 108.9 001F76 FACTORY: DW $+2 108.10 001F76 ELSE 108.11 001F76 .... FACTORY: DW DOCOLON 108.12 001F78 ENDIF 108.13 001F78 ENDM 109 001F78 ............* DW UINIT,U0,NINIT,ITOD ; store kernel user area table to user area 110 001F80 ............* DW VARBOT,lit,(VAR_SIZE)*2,ZERO,FILL ; set variables to ZERO 111 001F8A .... DW SAVE 112 001F8C .... DW DOTVER - 4e-core430G2553 - Page 145 113 001F8E .... DW EXIT 114 001F90 115 000000 PUBLIC FACTORYIP ; used to init IP register. 116 001F90 FACTORYIP equ FACTORY+2 117 001F90 118 001F90 119 001F90 ;U PROFUSE -- adr address of production fuse. 120 001F90 ; constant PROFUSEADR 121 001F90 HEADER PROFUSEADR,7,'PROFUSE',DOCON 121.1 000000 PUBLIC PROFUSEADR 121.2 001F90 .... DW link 121.3 001F92 FF DB 0FFh ; not immediate 121.4 001F93 link SET $ 121.5 001F93 07 DB 7 121.6 001F94 50524F465553* DB 'PROFUSE' 121.7 001F9B 00 EVEN 121.8 001F9C IF 'DOCON'='DOCODE' 121.9 001F9C PROFUSEADR: DW $+2 121.10 001F9C ELSE 121.11 001F9C .... PROFUSEADR: DW DOCON 121.12 001F9E ENDIF 121.13 001F9E ENDM 122 001F9E .... DW PROFUSE 123 001FA0 124 001FA0 ;U 4E4THPRO -- save app and blow production fuse. 125 001FA0 ; SAVE ZERO PROFUSEADR VEC! ; 126 001FA0 HEADER FORTHPRO,8,'4E4THPRO',DOCOLON 126.1 000000 PUBLIC FORTHPRO 126.2 001FA0 .... DW link 126.3 001FA2 FF DB 0FFh ; not immediate 126.4 001FA3 link SET $ 126.5 001FA3 08 DB 8 126.6 001FA4 344534544850* DB '4E4THPRO' 126.7 001FAC EVEN 126.8 001FAC IF 'DOCOLON'='DOCODE' 126.9 001FAC FORTHPRO: DW $+2 126.10 001FAC ELSE 126.11 001FAC .... FORTHPRO: DW DOCOLON 126.12 001FAE ENDIF 126.13 001FAE ENDM 127 001FAE ............* DW SAVE,ZERO,PROFUSEADR,VECSTORE 128 001FB6 .... DW EXIT 129 001FB8 130 001FB8 ;U WIPE -- erase flash but not kernel, reset user area. 131 001FB8 ; PROFUSEADR @ IF WIPE ELSE COLD TEHN ; 132 001FB8 HEADER WIPE,4,'WIPE',DOCOLON 132.1 000000 PUBLIC WIPE 132.2 001FB8 .... DW link 132.3 001FBA FF DB 0FFh ; not immediate 132.4 001FBB link SET $ 132.5 001FBB 04 DB 4 132.6 001FBC 57495045 DB 'WIPE' 132.7 001FC0 EVEN 132.8 001FC0 IF 'DOCOLON'='DOCODE' 132.9 001FC0 WIPE: DW $+2 132.10 001FC0 ELSE 132.11 001FC0 .... WIPE: DW DOCOLON 132.12 001FC2 ENDIF 132.13 001FC2 ENDM 133 001FC2 ............ DW PROFUSEADR,FETCH,qbran 134 001FC8 DEST wipe1 134.1 001FC8 0400 DW wipe1-$ 134.2 001FCA ENDM 135 001FCA .... DW PARENWIPE 136 001FCC .... wipe1: DW COLD 137 001FCE 138 001FCE ;U (WIPE) -- erase flash but not kernel, reset user area. 139 001FCE ; MEMBOT USERMEM FLERASE 140 001FCE ; FACTORY ." Wiped" ABORT ; 141 001FCE HEADER PARENWIPE,6,'(WIPE)',DOCOLON 141.1 000000 PUBLIC PARENWIPE 141.2 001FCE .... DW link 141.3 001FD0 FF DB 0FFh ; not immediate 141.4 001FD1 link SET $ - 4e-core430G2553 - Page 146 141.5 001FD1 06 DB 6 141.6 001FD2 285749504529 DB '(WIPE)' 141.7 001FD8 EVEN 141.8 001FD8 IF 'DOCOLON'='DOCODE' 141.9 001FD8 PARENWIPE: DW $+2 141.10 001FD8 ELSE 141.11 001FD8 .... PARENWIPE: DW DOCOLON 141.12 001FDA ENDIF 141.13 001FDA ENDM 142 001FDA ........0018* DW MEMBOT,lit,USERFLASHEND-USERFLASHSTAR T+1,FLERASE 143 001FE2 .... DW FACTORY 144 001FE4 .... DW XISQUOTE 145 001FE6 07 DB (wipmsg1-wipmsg0) 146 001FE7 205769706564 wipmsg0:DB ' Wiped' 147 001FED 00 EVEN 148 001FEE .... wipmsg1:DW ITYPE 149 001FF0 .... DW ABORT ; ABORT never returns 150 001FF2 988 001FF2 #include "4e-vecarea.s43" 1 001FF2 ; write vector area ============================ ======================= 2 001FF2 3 000000 EXTERN resetvec,reset 4 001FF2 5 001FF2 ; write vector area - or any flash location. !! dangerous!! 6 001FF2 ;Z VEC! x adr -- store x to top most segment 7 001FF2 HEADER VECSTORE,4,'VEC!',DOCODE 7.1 000000 PUBLIC VECSTORE 7.2 001FF2 .... DW link 7.3 001FF4 FF DB 0FFh ; not immediate 7.4 001FF5 link SET $ 7.5 001FF5 04 DB 4 7.6 001FF6 56454321 DB 'VEC!' 7.7 001FFA EVEN 7.8 001FFA IF 'DOCODE'='DOCODE' 7.9 001FFA .... VECSTORE: DW $+2 7.10 001FFC ELSE 7.11 001FFC VECSTORE: DW DOCODE 7.12 001FFC ENDIF 7.13 001FFC ENDM 8 001FFC 3644 MOV @PSP+,W ; get data to write 9 001FFE 17B3 BIT #1,TOS 10 002000 1320 JNZ IST_X2 ; if not even address, do not write 11 002002 2697 CMP @TOS,W 12 002004 1124 JZ IST_X2 ; if memory is desired value, do not write 13 002006 0212 PUSH sr 14 002008 32C2 DINT ; Disable interrupts 15 00200A B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear LOCK 16 002010 B24040A52801 MOV #FWKEY+WRT,&FCTL1 ; Enable write 17 002016 87460000 MOV W,0(TOS) ; Write word to flash location 18 00201A B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear WRT. 19 002020 B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Set LOCK 20 002026 ; EINT ; Enable interrupts 21 002026 3241 POP sr 22 002028 3744 IST_X2: MOV @PSP+,TOS ; pop new TOS 23 00202A NEXT 23.1 00202A 3645 MOV @IP+,W // ; fetch word address into W 23.2 00202C 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 23.3 00202E ENDM - 4e-core430G2553 - Page 147 24 00202E 25 00202E ;U (VECWIPE) -- erase top segment in flash 26 00202E HEADER PARENVECWIPE,9,'(VECWIPE)',DOCODE 26.1 000000 PUBLIC PARENVECWIPE 26.2 00202E .... DW link 26.3 002030 FF DB 0FFh ; not immediate 26.4 002031 link SET $ 26.5 002031 09 DB 9 26.6 002032 285645435749* DB '(VECWIPE)' 26.7 00203B 00 EVEN 26.8 00203C IF 'DOCODE'='DOCODE' 26.9 00203C .... PARENVECWIPE: DW $+2 26.10 00203E ELSE 26.11 00203E PARENVECWIPE: DW DOCODE 26.12 00203E ENDIF 26.13 00203E ENDM 27 00203E ; DW lit,intseg,lit,1,FLERASE ;geht so nicht, ist geschützt 28 00203E ; DW EXIT 29 00203E 3640.... MOV #intseg,W 30 002042 0212 PUSH sr 31 002044 32C2 DINT ; Disable interrupts 32 002046 B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear LOCK 33 00204C B24002A52801 MOV #FWKEY+ERASE,&FCTL1 ; Enable segment erase 34 002052 B6430000 MOV #-1,0(W) ; Dummy write in segment to erase 35 002056 B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear erase command. 36 00205C B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Done, set LOCK 37 002062 32D2 EINT ; Enable interrupts 38 002064 3241 POP sr 39 002066 NEXT 39.1 002066 3645 MOV @IP+,W // ; fetch word address into W 39.2 002068 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 39.3 00206A ENDM 40 00206A 41 00206A 42 00206A ;U VECWIPE -- erase ISR flash, set reset vector = reset to boot 4e4th. 43 00206A ; (VECWIPE) resetvector RESETADR VEC! ; 44 00206A HEADER VECWIPE,7,'VECWIPE',DOCOLON 44.1 000000 PUBLIC VECWIPE 44.2 00206A .... DW link 44.3 00206C FF DB 0FFh ; not immediate 44.4 00206D link SET $ 44.5 00206D 07 DB 7 44.6 00206E 564543574950* DB 'VECWIPE' 44.7 002075 00 EVEN 44.8 002076 IF 'DOCOLON'='DOCODE' 44.9 002076 VECWIPE: DW $+2 44.10 002076 ELSE 44.11 002076 .... VECWIPE: DW DOCOLON 44.12 002078 ENDIF 44.13 002078 ENDM 45 002078 .... DW PARENVECWIPE 46 00207A ............* DW lit,reset,RESETADR,VECSTORE 47 002082 .... DW EXIT 48 002084 49 002084 ;U VECSAVE -- save all vectors to infoD mk 50 002084 ; InfoD $40 FLERASE vecbot infoD $20 D->I ; 51 002084 HEADER VECSAVE,7,'VECSAVE',DOCOLON 51.1 000000 PUBLIC VECSAVE 51.2 002084 .... DW link 51.3 002086 FF DB 0FFh ; not immediate 51.4 002087 link SET $ - 4e-core430G2553 - Page 148 51.5 002087 07 DB 7 51.6 002088 564543534156* DB 'VECSAVE' 51.7 00208F 00 EVEN 51.8 002090 IF 'DOCOLON'='DOCODE' 51.9 002090 VECSAVE: DW $+2 51.10 002090 ELSE 51.11 002090 .... VECSAVE: DW DOCOLON 51.12 002092 ENDIF 51.13 002092 ENDM 52 002092 ........4000* DW INFOD,lit,0x40,FLERASE 53 00209A ............* DW VECBOT,INFOD,lit,0x20,DTOI 54 0020A4 .... DW EXIT 55 0020A6 56 0020A6 ;U VECRESTORE -- unconditional restore all saved vectors. 57 0020A6 ; vecwipe infoD vecbot $32 D->I ; 58 0020A6 HEADER VECRESTORE,10,'VECRESTORE',DOCOLON 58.1 000000 PUBLIC VECRESTORE 58.2 0020A6 .... DW link 58.3 0020A8 FF DB 0FFh ; not immediate 58.4 0020A9 link SET $ 58.5 0020A9 0A DB 10 58.6 0020AA 564543524553* DB 'VECRESTORE' 58.7 0020B4 EVEN 58.8 0020B4 IF 'DOCOLON'='DOCODE' 58.9 0020B4 VECRESTORE: DW $+2 58.10 0020B4 ELSE 58.11 0020B4 .... VECRESTORE: DW DOCOLON 58.12 0020B6 ENDIF 58.13 0020B6 ENDM 59 0020B6 .... DW VECWIPE 60 0020B8 ............* DW INFOD,VECBOT,lit,0x1E,DTOI ; dont touch reset vector. 61 0020C2 .... DW EXIT 62 0020C4 63 0020C4 /* 64 0020C4 ;U VECBACK -- write back of vectors: dont overwrite newer ones. 65 0020C4 ; $20 0 DO infoD i + @ vecbot i + @ $FFFF = 66 0020C4 ; IF vecbot i + vec! ELSE drop THEN 2 +LOOP ; 67 0020C4 HEADER VECBACK,7,'VECBACK',DOCOLON 68 0020C4 DW lit,0x20,ZERO,xdo 69 0020C4 vback1: DW INFOD,II,PLUS,FETCH 70 0020C4 DW VECBOT,II,PLUS,FETCH,lit,0xFFFF,EQUAL 71 0020C4 DW qbran 72 0020C4 DEST vback2 73 0020C4 DW VECBOT,II,PLUS,VECSTORE 74 0020C4 DW bran 75 0020C4 DEST vback3 76 0020C4 vback2: DW DROP 77 0020C4 vback3: DW lit,2,xplusloop 78 0020C4 DEST vback1 79 0020C4 DW EXIT 80 0020C4 */ 81 0020C4 82 0020C4 ;U VECBACK -- write back of vectors: dont overwrite newer ones. 83 0020C4 ; $20 0 DO vecbot i + @ FFFF = 84 0020C4 ; IF infoD i + @ vecbot i + vec! THEN 2 +LOOP ; 85 0020C4 HEADER VECBACK,7,'VECBACK',DOCOLON 85.1 000000 PUBLIC VECBACK 85.2 0020C4 .... DW link 85.3 0020C6 FF DB 0FFh ; not immediate 85.4 0020C7 link SET $ 85.5 0020C7 07 DB 7 85.6 0020C8 564543424143* DB 'VECBACK' 85.7 0020CF 00 EVEN 85.8 0020D0 IF 'DOCOLON'='DOCODE' 85.9 0020D0 VECBACK: DW $+2 85.10 0020D0 ELSE 85.11 0020D0 .... VECBACK: DW DOCOLON 85.12 0020D2 ENDIF 85.13 0020D2 ENDM 86 0020D2 ....2000....* DW lit,0x20,ZERO,xdo 87 0020DA ............*vback1: DW VECBOT,II,PLUS,FETCH,lit,0xFFFF,EQUAL - 4e-core430G2553 - Page 149 88 0020E8 .... DW qbran 89 0020EA DEST vback2 89.1 0020EA 1200 DW vback2-$ 89.2 0020EC ENDM 90 0020EC ............* DW INFOD,II,PLUS,FETCH 91 0020F4 ............* DW VECBOT,II,PLUS,VECSTORE 92 0020FC ....0200.... vback2: DW lit,2,xplusloop 93 002102 DEST vback1 93.1 002102 D8FF DW vback1-$ 93.2 002104 ENDM 94 002104 .... DW EXIT 95 002106 96 002106 ;U INTERRUPT isr iv -- store ISR address to interrupt vector address 97 002106 /* Store address of interrupt service routine to interrupt vector address, 98 002106 keep all other vectors. ´This is a slow flash operation. 99 002106 Saves all vectors to infoD, wipes vectors to FFFF, 100 002106 writes iv and then writes back the other vector values. */ 101 002106 ; vecsave vecwipe vec! vecback ; 102 002106 HEADER INTERRUPT,9,'INTERRUPT',DOCOLON 102.1 000000 PUBLIC INTERRUPT 102.2 002106 .... DW link 102.3 002108 FF DB 0FFh ; not immediate 102.4 002109 link SET $ 102.5 002109 09 DB 9 102.6 00210A 494E54455252* DB 'INTERRUPT' 102.7 002113 00 EVEN 102.8 002114 IF 'DOCOLON'='DOCODE' 102.9 002114 INTERRUPT: DW $+2 102.10 002114 ELSE 102.11 002114 .... INTERRUPT: DW DOCOLON 102.12 002116 ENDIF 102.13 002116 ENDM 103 002116 ............* DW VECSAVE,VECWIPE,VECSTORE,VECBACK 104 00211E .... DW EXIT 105 002120 106 002120 107 002120 ; finis 989 002120 #include "4e-LaunchPad.s43" 1 002120 ; ---------------------------------------------- ------------------------ 2 002120 ; 4e4th is a Forth based on CamelForth 3 002120 ; for the Texas Instruments MSP430 4 002120 ; 5 002120 ; This program is free software; you can redistribute it and/or modify 6 002120 ; it under the terms of the GNU General Public License as published by 7 002120 ; the Free Software Foundation; either version 3 of the License, or 8 002120 ; (at your option) any later version. 9 002120 ; 10 002120 ; This program is distributed in the hope that it will be useful, 11 002120 ; but WITHOUT ANY WARRANTY; without even the implied warranty of 12 002120 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 002120 ; GNU General Public License for more details. 14 002120 ; 15 002120 ; You should have received a copy of the GNU General Public License 16 002120 ; along with this program. If not, see . 17 002120 ; 18 002120 ; See LICENSE TERMS in Brads file readme.txt as well. 19 002120 20 002120 ; ---------------------------------------------- ------------------------ 21 002120 ; 4e-LaunchPad.s43 - LaunchPad Suporting Words - MSP430G2553 22 002120 ; ---------------------------------------------- - 4e-core430G2553 - Page 150 ------------------------ 23 002120 24 002120 25 002120 ;U PORTS --------------------------------------- ------------------------ 26 002120 27 002120 ; TI document SLAU144I - December 2004 - Revised January 2012 28 002120 ; The digital I/O registers are listed in Table 8-2. 29 002120 30 002120 ;U \ P1in = $20 31 002120 ;U \ P1out = $21 32 002120 ;U \ P1dir = $22 33 002120 34 002120 ;U \ P2in = $28 35 002120 ;U \ P2out = $29 36 002120 ;U \ P2dir = $2A 37 002120 38 002120 ;U \ LED - portpinX->---resistor---LED---GND 39 002120 ;U \ P1.0 - red LED 40 002120 ;U \ P1.6 - green LED 41 002120 42 002120 ;U RED -- mask port red LED mask and port address 43 002120 HEADER red,3,'RED',DOTWOCON 43.1 000000 PUBLIC red 43.2 002120 .... DW link 43.3 002122 FF DB 0FFh ; not immediate 43.4 002123 link SET $ 43.5 002123 03 DB 3 43.6 002124 524544 DB 'RED' 43.7 002127 00 EVEN 43.8 002128 IF 'DOTWOCON'='DOCODE' 43.9 002128 red: DW $+2 43.10 002128 ELSE 43.11 002128 .... red: DW DOTWOCON 43.12 00212A ENDIF 43.13 00212A ENDM 44 00212A 2100 DW P1OUT 45 00212C 0100 DW 00000001b 46 00212E 47 00212E ;U GREEN -- mask port green LED mask and port address 48 00212E HEADER green,5,'GREEN',DOTWOCON 48.1 000000 PUBLIC green 48.2 00212E .... DW link 48.3 002130 FF DB 0FFh ; not immediate 48.4 002131 link SET $ 48.5 002131 05 DB 5 48.6 002132 475245454E DB 'GREEN' 48.7 002137 00 EVEN 48.8 002138 IF 'DOTWOCON'='DOCODE' 48.9 002138 green: DW $+2 48.10 002138 ELSE 48.11 002138 .... green: DW DOTWOCON 48.12 00213A ENDIF 48.13 00213A ENDM 49 00213A 2100 DW P1OUT 50 00213C 4000 DW 01000000b 51 00213E 52 00213E ;U \ Switch S2 53 00213E ;U portpin P1.3 --->0_0----GND 54 00213E ;U S2 -- mask port second button mask and port address 55 00213E HEADER S2,2,'S2',DOTWOCON 55.1 000000 PUBLIC S2 55.2 00213E .... DW link 55.3 002140 FF DB 0FFh ; not immediate 55.4 002141 link SET $ 55.5 002141 02 DB 2 55.6 002142 5332 DB 'S2' 55.7 002144 EVEN 55.8 002144 IF 'DOTWOCON'='DOCODE' 55.9 002144 S2: DW $+2 55.10 002144 ELSE 55.11 002144 .... S2: DW DOTWOCON 55.12 002146 ENDIF - 4e-core430G2553 - Page 151 55.13 002146 ENDM 56 002146 2000 DW P1IN 57 002148 0800 DW 00001000b 58 00214A 59 00214A ;U S2? -- f test button S2, true is pressed 60 00214A HEADER SQEST,3,'S2?',DOCOLON 60.1 000000 PUBLIC SQEST 60.2 00214A .... DW link 60.3 00214C FF DB 0FFh ; not immediate 60.4 00214D link SET $ 60.5 00214D 03 DB 3 60.6 00214E 53323F DB 'S2?' 60.7 002151 00 EVEN 60.8 002152 IF 'DOCOLON'='DOCODE' 60.9 002152 SQEST: DW $+2 60.10 002152 ELSE 60.11 002152 .... SQEST: DW DOCOLON 60.12 002154 ENDIF 60.13 002154 ENDM 61 002154 ............* DW S2, cget, ZEROEQUAL, EXIT 62 00215C 63 00215C ; ---------------------------------------------- ------------------------ 990 00215C #include "4e-onewire.s43" 1 00215C ;****h* 4e4th/4e-onewire 2 00215C ; NAME 3 00215C ; 4e-onewire 4 00215C ; SYNOPSIS 5 00215C ; Dallas 1-wire drivers for 4e4th/CamelForth. 6 00215C ; DESCRIPTION 7 00215C ; These are "bit-banging" 1-wire drivers for the MSP430G2553 8 00215C ; MCU installed on a TI Launchpad board. 9 00215C ; Currently configured to use P2.3, with MCLK=8 MHz. 10 00215C ; NOTES 11 00215C ; 4e4th configures MCLK = DCOCLK = 8 MHz (see 4e-init430G2553.s43). 12 00215C ; Launchpad I/O pin usage: 13 00215C ; P1.0 - LED1 output 14 00215C ; P1.1 - UART 15 00215C ; P1.2 - UART 16 00215C ; P1.3 - SW2 input (internal pullup enabled) 17 00215C ; P1.4 - output (configured by 4e4th) 18 00215C ; P1.5 - output (configured by 4e4th) 19 00215C ; P2.0 20 00215C ; P2.1 21 00215C ; P2.2 22 00215C ; P2.3 - 1-wire I/O 23 00215C ; P2.4 24 00215C ; P2.5 25 00215C ; P1.6 - LED2 output 26 00215C ; P1.7 27 00215C ; MSP430G2553 pins are capable of sourcing or sinking 6 mA. 28 00215C ; Internal pullup resistor is 20-50 Kohm, typ. 35 Kohm, which 29 00215C ; is too high, so an external pullup resistor is required. 30 00215C ; Dallas DS18B20 data sheet suggests 4.7 Kohm pullup resistor. 31 00215C ; Dallas App Note 132 suggests 1.1 Kohm pullup resistor. 32 00215C ; Either external pullup is within limits for drive current. 33 00215C ; 34 00215C ; Note that the MSP430 does not have open-drain outputs. 35 00215C ; To simulate open-drain, a "0" is written to the pin's output 36 00215C ; register. When a "1" is written to the pin's direction register, 37 00215C ; the output is enabled and "0" is output. When a "0" is written 38 00215C ; to the direction register, the input is enabled and the pin is - 4e-core430G2553 - Page 152 39 00215C ; Hi-Z (equivalent to an open-drain "1" output). 40 00215C ; HISTORY 41 00215C ; 23 nov 12 bjr - Changed to use P2.3 for 1-wire I/O. 42 00215C ; 19 nov 12 bjr - Refactored code to make OWSLOT primitive instead 43 00215C ; of OWTOUCH. 44 00215C ; 23 oct 12 bjr - Created. 45 00215C ; AUTHOR 46 00215C ; B. J. Rodriguez 47 00215C ; COPYRIGHT 48 00215C ; (c) 2012 Bradford J. Rodriguez. 49 00215C ; 50 00215C ; This program is free software; you can redistribute it and/or modify 51 00215C ; it under the terms of the GNU General Public License as published by 52 00215C ; the Free Software Foundation; either version 3 of the License, or 53 00215C ; (at your option) any later version. 54 00215C ; 55 00215C ; This program is distributed in the hope that it will be useful, 56 00215C ; but WITHOUT ANY WARRANTY; without even the implied warranty of 57 00215C ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 58 00215C ; GNU General Public License for more details. 59 00215C ; 60 00215C ; You should have received a copy of the GNU General Public License 61 00215C ; along with this program. If not, see . 62 00215C ; 63 00215C ; Commercial inquiries should be directed to the author at 64 00215C ; 115 First St., #105, Collingwood, Ontario L9Y 4W3 Canada 65 00215C ; or via email to bj@camelforth.com 66 00215C ;****** 67 00215C 68 00215C ; define port registers and pin to be used for 1-wire (P2.3) 69 00215C #define OWIN P2IN 70 00215C #define OWOUT P2OUT 71 00215C #define OWDIR P2DIR 72 00215C #define OWREN P2REN 73 00215C #define OWBIT BIT3 74 00215C 75 00215C ; define MCLK frequency in MHz. 76 000008 MCLK EQU 8 77 00215C 78 00215C ; Define a software delay of N usec for our MCLK freq (8 MHz) 79 00215C ; Uses scratch register X. 80 00215C ; Note that due to truncation, may delay as many as 2 MCLK cycles 81 00215C ; short of the specified period. For 1-wire code this is ok, 82 00215C ; since we always have other instructions using at least 2 cycles. 83 00215C 90 00215C 91 00215C 92 00215C ;****f* 4e-onewire/OWRESET 93 00215C ; NAME 94 00215C ; OWRESET 95 00215C ; SYNOPSIS 96 00215C ; OWRESET ( -- f ) Initialize 1-wire devices; return true if present 97 00215C ; DESCRIPTION 98 00215C ; This configures the port pin used by the 1-wire interface, and then 99 00215C ; sends an "initialize" sequence to the 1-wire devices. If any device 100 00215C ; is present, it will be detected. - 4e-core430G2553 - Page 153 101 00215C ; 102 00215C ; Timing, per DS18B20 data sheet: 103 00215C ; a) Output "0" (drive output low) for >480 usec. 104 00215C ; b) Output "1" (let output float). 105 00215C ; c) After 15 to 60 usec, device will drive pin low for 60 to 240 usec. 106 00215C ; So, wait 75 usec and sample input. 107 00215C ; d) Leave output high (floating) for at least 480 usec. 108 00215C ;****** 109 00215C 110 00215C HEADER OWRESET,7,'OWRESET',DOCODE 110.1 000000 PUBLIC OWRESET 110.2 00215C .... DW link 110.3 00215E FF DB 0FFh ; not immediate 110.4 00215F link SET $ 110.5 00215F 07 DB 7 110.6 002160 4F5752455345* DB 'OWRESET' 110.7 002167 00 EVEN 110.8 002168 IF 'DOCODE'='DOCODE' 110.9 002168 .... OWRESET: DW $+2 110.10 00216A ELSE 110.11 00216A OWRESET: DW DOCODE 110.12 00216A ENDIF 110.13 00216A ENDM 111 00216A 112 00216A ; push old TOS onto stack 113 00216A 2483 SUB #2,PSP ; 1 114 00216C 84470000 MOV TOS,0(PSP) ; 4 115 002170 116 002170 ; preclear result in TOS 117 002170 0743 MOV #0,TOS 118 002172 119 002172 ; initialize the pin used for the 1-wire. 120 002172 F0C2.... BIC.B #OWBIT,OWDIR ; make pin an input 121 002176 F0C2.... BIC.B #OWBIT,OWOUT ; make output bit a "0" 122 00217A F0C2.... BIC.B #OWBIT,OWREN ; disable internal pullup 123 00217E 124 00217E ; Delay >480 usec in case output pin had been low 125 00217E DELAY 500 125.1 00217E LOCAL loop 125.2 00217E 3A403405 MOV #(((500*MCLK)-2)/3),X ; 2 125.3 002182 1A83 loop: SUB #1,X ; 1n 125.4 002184 FE23 JNZ loop ; 2n 125.5 002186 ENDM 126 002186 127 002186 ; Pull output low 128 002186 F0D2.... BIS.B #OWBIT,OWDIR ; make pin output, sends "0" 129 00218A 130 00218A ; Delay >480 usec 131 00218A DELAY 500 131.1 00218A LOCAL loop 131.2 00218A 3A403405 MOV #(((500*MCLK)-2)/3),X ; 2 131.3 00218E 1A83 loop: SUB #1,X ; 1n 131.4 002190 FE23 JNZ loop ; 2n 131.5 002192 ENDM 132 002192 133 002192 ; Critical timing period, disable interrupts. 134 002192 32C2 BIC #8,SR ; clear GIE bit 135 002194 - 4e-core430G2553 - Page 154 136 002194 ; Pull output high 137 002194 F0C2.... BIC.B #OWBIT,OWDIR ; make pin input, sends "1" 138 002198 139 002198 ; Delay 75 usec 140 002198 DELAY 75 140.1 002198 LOCAL loop 140.2 002198 3A40C700 MOV #(((75*MCLK)-2)/3),X ; 2 140.3 00219C 1A83 loop: SUB #1,X ; 1n 140.4 00219E FE23 JNZ loop ; 2n 140.5 0021A0 ENDM 141 0021A0 142 0021A0 ; Sample input pin, set TOS if input is zero 143 0021A0 F0B2.... BIT.B #OWBIT,OWIN 144 0021A4 0120 JNZ OWNONE 145 0021A6 3743 MOV #-1,TOS ; if input zero, an 1-wire is present 146 0021A8 OWNONE: 147 0021A8 ; End critical timing period, enable interrupts 148 0021A8 32D2 BIS #8,SR ; set GIE bit 149 0021AA 150 0021AA ; Delay rest of 480 usec (we've already delayed 75 usec) 151 0021AA DELAY 405 151.1 0021AA LOCAL loop 151.2 0021AA 3A403704 MOV #(((405*MCLK)-2)/3),X ; 2 151.3 0021AE 1A83 loop: SUB #1,X ; 1n 151.4 0021B0 FE23 JNZ loop ; 2n 151.5 0021B2 ENDM 152 0021B2 153 0021B2 ; we now have the result flag in TOS 154 0021B2 NEXT 154.1 0021B2 3645 MOV @IP+,W // ; fetch word address into W 154.2 0021B4 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 154.3 0021B6 ENDM 155 0021B6 156 0021B6 ;****f* 4e-onewire/OWSLOT 157 0021B6 ; NAME 158 0021B6 ; OWSLOT 159 0021B6 ; SYNOPSIS 160 0021B6 ; OWSLOT ( c -- c' ) Write and read one bit to/from 1-wire. 161 0021B6 ; DESCRIPTION 162 0021B6 ; The "touch byte" function is described in Dallas App Note 74. 163 0021B6 ; It outputs a byte to the 1-wire pin, LSB first, and reads back 164 0021B6 ; the state of the 1-wire pin after a suitable delay. 165 0021B6 ; To read a byte, output $FF and read the reply data. 166 0021B6 ; To write a byte, output that byte and discard the reply. 167 0021B6 ; 168 0021B6 ; This function performs one bit of the "touch" operation -- 169 0021B6 ; one read/write "slot" in Dallas jargon. Perform this eight 170 0021B6 ; times in a row to get the "touch byte" function. 171 0021B6 ; 172 0021B6 ; PARAMETERS 173 0021B6 ; The input parameter is xxxxxxxxbbbbbbbo where - 4e-core430G2553 - Page 155 174 0021B6 ; 'xxxxxxxx' are don't cares, 175 0021B6 ; 'bbbbbbb' are bits to be shifted down, and 176 0021B6 ; 'o' is the bit to be output in the slot. This must be 1 177 0021B6 ; to create a read slot. 178 0021B6 ; 179 0021B6 ; The returned value is xxxxxxxxibbbbbbb where 180 0021B6 ; 'xxxxxxxx' are not known (the input shifted down 1 position), 181 0021B6 ; 'i' is the bit read during the slot. This has no meaning 182 0021B6 ; if it was a write slot. 183 0021B6 ; 'bbbbbbb' are the 7 input bits, shifted down one position. 184 0021B6 ; 185 0021B6 ; This peculiar parameter usage allows OWTOUCH to be written as 186 0021B6 ; OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT 187 0021B6 ; 188 0021B6 ; NOTES 189 0021B6 ; Interrupts are disabled during each bit. 190 0021B6 191 0021B6 ; Timing, per DS18B20 data sheet: 192 0021B6 ; a) Output "0" for start period. (> 1 us, < 15 us, typ. 6 us*) 193 0021B6 ; b) Output data bit (0 or 1), open drain 194 0021B6 ; c) After MS from start of cycle, sample input (15 to 60 us, typ. 25 us*) 195 0021B6 ; d) After write-0 period from start of cycle, output "1" (>60 us) 196 0021B6 ; e) After recovery period, loop or return. (> 1 us) 197 0021B6 ; For writes, DS18B20 samples input 15 to 60 usec from start of cycle. 198 0021B6 ; * "Typical" values are per App Note 132 for a 300m cable length. 199 0021B6 200 0021B6 ; --------- --------------------------- ---- 201 0021B6 ; \ / / 202 0021B6 ; ------------------------------- 203 0021B6 ; a b c d e 204 0021B6 ; | 6us | 19us | 35us | 2us | 205 0021B6 ;****** 206 0021B6 207 0021B6 HEADER OWSLOT,6,'OWSLOT',DOCODE 207.1 000000 PUBLIC OWSLOT 207.2 0021B6 .... DW link 207.3 0021B8 FF DB 0FFh ; not immediate 207.4 0021B9 link SET $ 207.5 0021B9 06 DB 6 207.6 0021BA 4F57534C4F54 DB 'OWSLOT' 207.7 0021C0 EVEN 207.8 0021C0 IF 'DOCODE'='DOCODE' 207.9 0021C0 .... OWSLOT: DW $+2 207.10 0021C2 ELSE 207.11 0021C2 OWSLOT: DW DOCODE 207.12 0021C2 ENDIF 207.13 0021C2 ENDM 208 0021C2 209 0021C2 37C00001 BIC #0x100,TOS ; preclear result bit in TOS 210 0021C6 211 0021C6 ; disable interrupts 212 0021C6 32C2 BIC #8,SR ; clear GIE bit 213 0021C8 214 0021C8 ; output a "0" - 4e-core430G2553 - Page 156 215 0021C8 F0D2.... BIS.B #OWBIT,OWDIR ; make pin output, sends "0" 216 0021CC F0C2.... BIC.B #OWBIT,OWOUT ; just in case, ensure 0 is output 217 0021D0 218 0021D0 ; delay 6 usec 219 0021D0 DELAY 6 219.1 0021D0 LOCAL loop 219.2 0021D0 3A400F00 MOV #(((6*MCLK)-2)/3),X ; 2 219.3 0021D4 1A83 loop: SUB #1,X ; 1n 219.4 0021D6 FE23 JNZ loop ; 2n 219.5 0021D8 ENDM 220 0021D8 221 0021D8 ; output the LSB (no action required if LSB=0) 222 0021D8 17B3 BIT #1,TOS 223 0021DA 0224 JZ OWSEND0 224 0021DC F0C2.... BIC.B #OWBIT,OWDIR ; make pin input, sends "1" 225 0021E0 OWSEND0: 226 0021E0 227 0021E0 ; delay 19 usec 228 0021E0 DELAY 19 228.1 0021E0 LOCAL loop 228.2 0021E0 3A403200 MOV #(((19*MCLK)-2)/3),X ; 2 228.3 0021E4 1A83 loop: SUB #1,X ; 1n 228.4 0021E6 FE23 JNZ loop ; 2n 228.5 0021E8 ENDM 229 0021E8 230 0021E8 ; sample the input (no action required if zero) 231 0021E8 F0B2.... BIT.B #OWBIT,OWIN 232 0021EC 0224 JZ OWRECV0 233 0021EE 37D00001 BIS #0x100,TOS ; if input=1, store 1 in high TOS 234 0021F2 0711 OWRECV0: RRA TOS ; shift TOS down 1 bit 235 0021F4 236 0021F4 ; delay 35 usec 237 0021F4 DELAY 35 237.1 0021F4 LOCAL loop 237.2 0021F4 3A405C00 MOV #(((35*MCLK)-2)/3),X ; 2 237.3 0021F8 1A83 loop: SUB #1,X ; 1n 237.4 0021FA FE23 JNZ loop ; 2n 237.5 0021FC ENDM 238 0021FC 239 0021FC ; output a "1" 240 0021FC F0C2.... BIC.B #OWBIT,OWDIR ; make pin input = Hi-Z 241 002200 242 002200 ; enable interrupts 243 002200 32D2 BIS #8,SR ; set GIE bit 244 002202 245 002202 ; delay 2 usec 246 002202 DELAY 2 246.1 002202 LOCAL loop 246.2 002202 2A42 MOV #(((2*MCLK)-2)/3),X ; 2 246.3 002204 1A83 loop: SUB #1,X ; 1n 246.4 002206 FE23 JNZ loop ; 2n 246.5 002208 ENDM 247 002208 - 4e-core430G2553 - Page 157 248 002208 ; note that NEXT will take 0.5 usec (4 clocks) 249 002208 ; we now have the received bit in the 0x80 bit of TOS. 250 002208 NEXT 250.1 002208 3645 MOV @IP+,W // ; fetch word address into W 250.2 00220A 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 250.3 00220C ENDM 991 00220C #include "4e-LPM.s43" 1 00220C ; setup a sleep function. 2 00220C 3 00220C /*********************************************** ************* 4 00220C * Interrupt Vectors (offset from 0xFFE0) 5 00220C 6 00220C #define PORT1_VECTOR (2 * 2u) 0xFFE4 Port 1 7 00220C #define PORT2_VECTOR (3 * 2u) 0xFFE6 Port 2 8 00220C #define ADC10_VECTOR (5 * 2u) 0xFFEA ADC10 9 00220C #define USCIAB0TX_VECTOR (6 * 2u) 0xFFEC USCI A0/B0 Transmit 10 00220C #define USCIAB0RX_VECTOR (7 * 2u) 0xFFEE USCI A0/B0 Receive 11 00220C #define TIMER0_A1_VECTOR (8 * 2u) 0xFFF0 Timer0)A CC1, TA0 12 00220C #define TIMER0_A0_VECTOR (9 * 2u) 0xFFF2 Timer0_A CC0 13 00220C #define WDT_VECTOR (10 * 2u) 0xFFF4 Watchdog Timer 14 00220C #define COMPARATORA_VECTOR (11 * 2u) 0xFFF6 Comparator A 15 00220C #define TIMER1_A1_VECTOR (12 * 2u) 0xFFF8 Timer1_A CC1-4, TA1 16 00220C #define TIMER1_A0_VECTOR (13 * 2u) 0xFFFA Timer1_A CC0 17 00220C #define NMI_VECTOR (14 * 2u) 0xFFFC Non-maskable 18 00220C #define RESET_VECTOR (15 * 2u) 0xFFFE Reset [Highest Priority] 19 00220C 20 00220C services: 21 00220C - UCA0 interupt enable. 22 00220C - Activate LPM4 mode. 23 00220C - UCA0 ISR disables lpm4 mode. 24 00220C - UCA0 interupt disable. 25 00220C 26 00220C ************************************************ ***************/ 27 00220C 28 00220C ;C IRXON -- turn UCA0 interrupt on 29 00220C HEADER IRXON,5,'IRXON',DOCODE 29.1 000000 PUBLIC IRXON 29.2 00220C .... DW link 29.3 00220E FF DB 0FFh ; not immediate 29.4 00220F link SET $ 29.5 00220F 05 DB 5 29.6 002210 4952584F4E DB 'IRXON' 29.7 002215 00 EVEN 29.8 002216 IF 'DOCODE'='DOCODE' 29.9 002216 .... IRXON: DW $+2 29.10 002218 ELSE 29.11 002218 IRXON: DW DOCODE 29.12 002218 ENDIF 29.13 002218 ENDM 30 002218 D0D3.... BIS.B #UCA0RXIE,IE2 31 00221C NEXT 31.1 00221C 3645 MOV @IP+,W // ; fetch word address into W 31.2 00221E 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 31.3 002220 ENDM 32 002220 33 002220 ;C IRXOFF -- turn UCA0 interrupt - 4e-core430G2553 - Page 158 off 34 002220 HEADER IRXOFF,6,'IRXOFF',DOCODE 34.1 000000 PUBLIC IRXOFF 34.2 002220 .... DW link 34.3 002222 FF DB 0FFh ; not immediate 34.4 002223 link SET $ 34.5 002223 06 DB 6 34.6 002224 4952584F4646 DB 'IRXOFF' 34.7 00222A EVEN 34.8 00222A IF 'DOCODE'='DOCODE' 34.9 00222A .... IRXOFF: DW $+2 34.10 00222C ELSE 34.11 00222C IRXOFF: DW DOCODE 34.12 00222C ENDIF 34.13 00222C ENDM 35 00222C D0C3.... BIC.B #UCA0RXIE,IE2 36 002230 NEXT 36.1 002230 3645 MOV @IP+,W // ; fetch word address into W 36.2 002232 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 36.3 002234 ENDM 37 002234 38 002234 ;C LPM_WAKE -- adr LPM wake up interrupt service routine address 39 002234 ; turns off LPM mode. 40 002234 HEADER LPM_WAKE,8,'LPM_WAKE',DOCON 40.1 000000 PUBLIC LPM_WAKE 40.2 002234 .... DW link 40.3 002236 FF DB 0FFh ; not immediate 40.4 002237 link SET $ 40.5 002237 08 DB 8 40.6 002238 4C504D5F5741* DB 'LPM_WAKE' 40.7 002240 EVEN 40.8 002240 IF 'DOCON'='DOCODE' 40.9 002240 LPM_WAKE: DW $+2 40.10 002240 ELSE 40.11 002240 .... LPM_WAKE: DW DOCON 40.12 002242 ENDIF 40.13 002242 ENDM 41 002242 .... DW lpm_wake 42 002244 lpm_wake: 43 002244 ; BIS.B #BIT0,&021h ; red LED on 44 002244 B1C0F8000000 BIC #(GIE+LPM4),0(RSP) ; clear SR on return stack - turn CPU on. 45 00224A 0013 RETI 46 00224C 47 00224C ;Z LPM4 -- ; Enter low power mode 4, wake on interrupt. 48 00224C HEADER setlpm4,4,'LPM4',DOCODE 48.1 000000 PUBLIC setlpm4 48.2 00224C .... DW link 48.3 00224E FF DB 0FFh ; not immediate 48.4 00224F link SET $ 48.5 00224F 04 DB 4 48.6 002250 4C504D34 DB 'LPM4' 48.7 002254 EVEN 48.8 002254 IF 'DOCODE'='DOCODE' 48.9 002254 .... setlpm4: DW $+2 48.10 002256 ELSE 48.11 002256 setlpm4: DW DOCODE 48.12 002256 ENDIF 48.13 002256 ENDM 49 002256 ; BIC.B #BIT0,&021h ; red LED off 50 002256 0212 PUSH SR 51 002258 32D0F800 BIS #(GIE+LPM4),SR ; CPU stops here 52 00225C 3241 POP SR 53 00225E ; DINT 54 00225E ; BIS.B #BIT0,&021h ; red LED on 55 00225E NEXT 55.1 00225E 3645 MOV @IP+,W // ; fetch word address into W - 4e-core430G2553 - Page 159 55.2 002260 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 55.3 002262 ENDM 56 002262 57 002262 ;Z LPM0 -- ; Enter low power mode 0, wake on interrupt. 58 002262 HEADER setlpm0,4,'LPM0',DOCODE 58.1 000000 PUBLIC setlpm0 58.2 002262 .... DW link 58.3 002264 FF DB 0FFh ; not immediate 58.4 002265 link SET $ 58.5 002265 04 DB 4 58.6 002266 4C504D30 DB 'LPM0' 58.7 00226A EVEN 58.8 00226A IF 'DOCODE'='DOCODE' 58.9 00226A .... setlpm0: DW $+2 58.10 00226C ELSE 58.11 00226C setlpm0: DW DOCODE 58.12 00226C ENDIF 58.13 00226C ENDM 59 00226C ; BIC.B #BIT0,&021h ; red LED off 60 00226C 0212 PUSH SR 61 00226E 32D01800 BIS #(GIE+LPM0),SR ; CPU stops here 62 002272 3241 POP SR 63 002274 ; DINT 64 002274 ; BIS.B #BIT0,&021h ; red LED on 65 002274 NEXT 65.1 002274 3645 MOV @IP+,W // ; fetch word address into W 65.2 002276 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 65.3 002278 ENDM 66 002278 67 002278 ;Z SETIRX -- set IRX vector to wakr up MCU 68 002278 ; lpm_wake-isr_rx FFEE interrrupt ; 69 002278 HEADER SETIRX,6,'SETIRX',DOCOLON 69.1 000000 PUBLIC SETIRX 69.2 002278 .... DW link 69.3 00227A FF DB 0FFh ; not immediate 69.4 00227B link SET $ 69.5 00227B 06 DB 6 69.6 00227C 534554495258 DB 'SETIRX' 69.7 002282 EVEN 69.8 002282 IF 'DOCOLON'='DOCODE' 69.9 002282 SETIRX: DW $+2 69.10 002282 ELSE 69.11 002282 .... SETIRX: DW DOCOLON 69.12 002284 ENDIF 69.13 002284 ENDM 70 002284 ............* DW LPM_WAKE,lit,(intvecs+USCIAB0RX_VECT OR),INTERRUPT 71 00228C .... DW EXIT 72 00228E 73 00228E 74 00228E /*********************************************** *************** 75 00228E ;Z IE2 -- adr Interrupt enable register for UCA0 76 00228E HEADER IE2CON,3,'IE2',DOCON 77 00228E DW IE2 78 00228E 79 00228E ;Z UCA0RXIE -- adr Interrupt mask UCA0 80 00228E HEADER UCA0RXIEmask,8,'UCA0RXIE',DOCON 81 00228E DW UCA0RXIE 82 00228E ************************************************ ***************/ 83 00228E 84 00228E ; finis 992 00228E ; #include "4e-WAS430G2553.s43" 993 00228E 994 00228E 995 00228E /* 996 00228E ; DEBUG FORTH EXECUTION - 4e-core430G2553 - Page 160 997 00228E ; debug serieal 998 00228E PUBLIC DEBUGIP 999 00228E DEBUGIP: 1000 00228E ; DW DOTID 1001 00228E DEBUG1: 1002 00228E ; DW TASK 1003 00228E DW KEY ; 1@A0 test 1=rot,@=grün,A=beide,0=a us 1004 00228E DW DUP ;,DOTS,CR 1005 00228E DW STORELEDS 1006 00228E ; DW COLD 1007 00228E DW EMIT 1008 00228E DW lit,0,qbran 1009 00228E DW DEBUG1-$ 1010 00228E DW bran,-2 1011 00228E 1012 00228E /* 1013 00228E ; debugging only 1014 00228E HEADLESS CREATE,DOCOLON 1015 00228E HEADLESS ALLOT,DOCOLON 1016 00228E HEADLESS BUILDS,DOCOLON 1017 00228E HEADLESS ICOMMA,DOCOLON 1018 00228E HEADLESS XDOES,DOCOLON 1019 00228E HEADLESS IHERE,DOCOLON 1020 00228E HEADLESS IALLOT,DOCOLON 1021 00228E HEADLESS CELL,DOCOLON 1022 00228E HEADLESS PJOUT,DOCOLON 1023 00228E */ 1024 00228E 1025 00228E 1026 000000 PUBLIC lastword 1027 00228E lastword equ link 1028 00228E 1029 00228E ; for debug map only: 1030 00228E CamelForthEnd: 1031 00228E 1032 00228E END ACCVIE #define, value: (0x20), line: 132:2 ACCVIFG #define, value: (0x0004u), line: 448:2 ADC10AE0_ #define, value: (0x004Au), line: 167:2 168:2 ADC10B1 #define, value: (0x002), line: 271:2 ADC10BUSY #define, value: (0x0001u), line: 211:2 ADC10CT #define, value: (0x004), line: 272:2 ADC10CTL0_ #define, value: (0x01B0u), line: 170:2 171:2 ADC10CTL1_ #define, value: (0x01B2u), line: 172:2 173:2 ADC10DF #define, value: (0x0200u), line: 220:2 ADC10DISABLE #define, value: (0x000), line: 274:2 ADC10DIV0 #define, value: (0x0020u), line: 216:2 ADC10DIV1 #define, value: (0x0040u), line: 217:2 ADC10DIV2 #define, value: (0x0080u), line: 218:2 ADC10DIV_0 #define, value: (0*0x20u), line: 238:2 ADC10DIV_1 #define, value: (1*0x20u), line: 239:2 ADC10DIV_2 #define, value: (2*0x20u), line: 240:2 ADC10DIV_3 #define, value: (3*0x20u), line: 241:2 ADC10DIV_4 #define, value: (4*0x20u), line: 242:2 ADC10DIV_5 #define, value: (5*0x20u), line: 243:2 ADC10DIV_6 #define, value: (6*0x20u), line: 244:2 ADC10DIV_7 #define, value: (7*0x20u), line: 245:2 ADC10DTC0_ #define, value: (0x0048u), line: 163:2 164:2 ADC10DTC1_ #define, value: (0x0049u), line: 165:2 166:2 ADC10FETCH #define, value: (0x001), line: 270:2 ADC10IE #define, value: (0x008), line: 183:2 ADC10IFG #define, value: (0x004), line: 182:2 ADC10MEM_ #define, value: (0x01B4u), line: 174:2 175:2 ADC10ON #define, value: (0x010), line: 184:2 ADC10SA_ #define, value: (0x01BCu), line: 176:2 177:2 ADC10SC #define, value: (0x001), line: 180:2 ADC10SHT0 #define, value: (0x800), line: 191:2 ADC10SHT1 #define, value: (0x1000u), line: 192:2 ADC10SHT_0 #define, value: (0*0x800u), line: 196:2 ADC10SHT_1 #define, value: (1*0x800u), line: 197:2 ADC10SHT_2 #define, value: (2*0x800u), line: 198:2 ADC10SHT_3 #define, value: (3*0x800u), line: 199:2 ADC10SR #define, value: (0x400), line: 190:2 ADC10SSEL0 #define, value: (0x0008u), line: 214:2 ADC10SSEL1 #define, value: (0x0010u), line: 215:2 - 4e-core430G2553 - Page 161 ADC10SSEL_0 #define, value: (0*8u), line: 233:2 ADC10SSEL_1 #define, value: (1*8u), line: 234:2 ADC10SSEL_2 #define, value: (2*8u), line: 235:2 ADC10SSEL_3 #define, value: (3*8u), line: 236:2 ADC10TB #define, value: (0x008), line: 273:2 ADC10_VECTOR #define, value: (5 * 2u), line: 965:2 BCSCTL1_ #define, value: (0x0057u), line: 283:2 284:2 BCSCTL2_ #define, value: (0x0058u), line: 285:2 286:2 BCSCTL3_ #define, value: (0x0053u), line: 287:2 288:2 BIT0 #define, value: (0x0001u), line: 57:2 BIT1 #define, value: (0x0002u), line: 58:2 BIT2 #define, value: (0x0004u), line: 59:2 BIT3 #define, value: (0x0008u), line: 60:2 120:9 121:9 122:9 128:9 137:9 143:9 215:9 216:9 224:9 231:9 240:9 BIT4 #define, value: (0x0010u), line: 61:2 BIT5 #define, value: (0x0020u), line: 62:2 BIT6 #define, value: (0x0040u), line: 63:2 BIT7 #define, value: (0x0080u), line: 64:2 BIT8 #define, value: (0x0100u), line: 65:2 BIT9 #define, value: (0x0200u), line: 66:2 BITA #define, value: (0x0400u), line: 67:2 BITB #define, value: (0x0800u), line: 68:2 BITC #define, value: (0x1000u), line: 69:2 BITD #define, value: (0x2000u), line: 70:2 BITE #define, value: (0x4000u), line: 71:2 BITF #define, value: (0x8000u), line: 72:2 BLKWRT #define, value: (0x0080u), line: 423:2 BUSY #define, value: (0x0001u), line: 446:2 C #define, value: (0x0001u), line: 78:2 CACTL1_ #define, value: (0x0059u), line: 365:2 366:2 CACTL2_ #define, value: (0x005Au), line: 367:2 368:2 CAEX #define, value: (0x80), line: 379:2 CAF #define, value: (0x02), line: 387:2 CAIE #define, value: (0x02), line: 373:2 CAIES #define, value: (0x04), line: 374:2 CAIFG #define, value: (0x01), line: 372:2 CALBC1_12MHZ_ #define, value: (0x10FBu), line: 946:2 947:2 CALBC1_16MHZ_ #define, value: (0x10F9u), line: 942:2 943:2 CALBC1_1MHZ_ #define, value: (0x10FFu), line: 954:2 955:2 CALBC1_8MHZ_ #define, value: (0x10FDu), line: 950:2 951:2 CALDCO_12MHZ_ #define, value: (0x10FAu), line: 944:2 945:2 CALDCO_16MHZ_ #define, value: (0x10F8u), line: 940:2 941:2 CALDCO_1MHZ_ #define, value: (0x10FEu), line: 952:2 953:2 CALDCO_8MHZ_ #define, value: (0x10FCu), line: 948:2 949:2 CAON #define, value: (0x08), line: 375:2 CAOUT #define, value: (0x01), line: 386:2 CAP #define, value: (0x0100u), line: 604:2 CAPD0 #define, value: (0x01), line: 395:2 CAPD1 #define, value: (0x02), line: 396:2 CAPD2 #define, value: (0x04), line: 397:2 CAPD3 #define, value: (0x08), line: 398:2 CAPD4 #define, value: (0x10), line: 399:2 CAPD5 #define, value: (0x20), line: 400:2 CAPD6 #define, value: (0x40), line: 401:2 CAPD7 #define, value: (0x80), line: 402:2 CAPD_ #define, value: (0x005Bu), line: 369:2 370:2 CAREF0 #define, value: (0x10), line: 376:2 CAREF1 #define, value: (0x20), line: 377:2 CAREF_0 #define, value: (0x00), line: 381:2 CAREF_1 #define, value: (0x10), line: 382:2 CAREF_2 #define, value: (0x20), line: 383:2 CAREF_3 #define, value: (0x30), line: 384:2 CARSEL #define, value: (0x40), line: 378:2 CASHORT #define, value: (0x80), line: 393:2 CCI #define, value: (0x0008u), line: 609:2 CCIE #define, value: (0x0010u), line: 608:2 CCIFG #define, value: (0x0001u), line: 612:2 CCIS0 #define, value: (0x1000u), line: 601:2 CCIS1 #define, value: (0x2000u), line: 600:2 CCIS_0 #define, value: (0*0x1000u), line: 622:2 CCIS_1 #define, value: (1*0x1000u), line: 623:2 CCIS_2 #define, value: (2*0x1000u), line: 624:2 CCIS_3 #define, value: (3*0x1000u), line: 625:2 CCR0 #define, value: TACCR0, line: 565:2 CCR0_ #define, value: TACCR0_, line: 571:2 CCR1 #define, value: TACCR1, line: 566:2 CCR1_ #define, value: TACCR1_, line: 572:2 - 4e-core430G2553 - Page 162 CCR2 #define, value: TACCR2, line: 567:2 CCR2_ #define, value: TACCR2_, line: 573:2 CCTL0 #define, value: TACCTL0, line: 562:2 CCTL0_ #define, value: TACCTL0_, line: 568:2 CCTL1 #define, value: TACCTL1, line: 563:2 CCTL1_ #define, value: TACCTL1_, line: 569:2 CCTL2 #define, value: TACCTL2, line: 564:2 CCTL2_ #define, value: TACCTL2_, line: 570:2 CM0 #define, value: (0x4000u), line: 599:2 CM1 #define, value: (0x8000u), line: 598:2 CM_0 #define, value: (0*0x4000u), line: 626:2 CM_1 #define, value: (1*0x4000u), line: 627:2 CM_2 #define, value: (2*0x4000u), line: 628:2 CM_3 #define, value: (3*0x4000u), line: 629:2 COMPARATORA_VECTOR #define, value: (11 * 2u), line: 971:2 CONSEQ0 #define, value: (0x0002u), line: 212:2 CONSEQ1 #define, value: (0x0004u), line: 213:2 CONSEQ_0 #define, value: (0*2u), line: 228:2 CONSEQ_1 #define, value: (1*2u), line: 229:2 CONSEQ_2 #define, value: (2*2u), line: 230:2 CONSEQ_3 #define, value: (3*2u), line: 231:2 COV #define, value: (0x0002u), line: 611:2 CPUOFF #define, value: (0x0010u), line: 83:2 44:10 51:10 61:10 DCO0 #define, value: (0x20), line: 295:2 DCO1 #define, value: (0x40), line: 296:2 DCO2 #define, value: (0x80), line: 297:2 DCOCTL_ #define, value: (0x0056u), line: 281:2 282:2 DEFC #define, line: 42:2 128:2 135:2 143:2 151:2 164:2 166:2 168:2 282:2 284:2 286:2 288:2 366:2 368:2 370:2 462:2 464:2 466:2 468:2 470:2 472:2 474:2 476:2 478:2 481:2 483:2 485:2 487:2 489:2 491:2 493:2 495:2 497:2 505:2 507:2 509:2 511:2 513:2 515:2 677:2 679:2 681:2 683:2 685:2 687:2 689:2 691:2 693:2 695:2 697:2 702:2 704:2 706:2 708:2 710:2 712:2 714:2 716:2 941:2 943:2 945:2 947:2 949:2 951:2 953:2 955:2 DEFW #define, line: 43:2 171:2 173:2 175:2 177:2 410:2 412:2 414:2 523:2 525:2 527:2 529:2 531:2 533:2 535:2 537:2 539:2 645:2 647:2 649:2 651:2 653:2 655:2 657:2 659:2 661:2 718:2 720:2 893:2 DIVA0 #define, value: (0x10), line: 303:2 DIVA1 #define, value: (0x20), line: 304:2 DIVA_0 #define, value: (0x00), line: 308:2 DIVA_1 #define, value: (0x10), line: 309:2 DIVA_2 #define, value: (0x20), line: 310:2 DIVA_3 #define, value: (0x30), line: 311:2 DIVM0 #define, value: (0x10), line: 316:2 DIVM1 #define, value: (0x20), line: 317:2 DIVM_0 #define, value: (0x00), line: 326:2 DIVM_1 #define, value: (0x10), line: 327:2 DIVM_2 #define, value: (0x20), line: 328:2 DIVM_3 #define, value: (0x30), line: 329:2 DIVS0 #define, value: (0x02), line: 313:2 DIVS1 #define, value: (0x04), line: 314:2 DIVS_0 #define, value: (0x00), line: 321:2 DIVS_1 #define, value: (0x02), line: 322:2 DIVS_2 #define, value: (0x04), line: 323:2 DIVS_3 #define, value: (0x06), line: 324:2 EMEX #define, value: (0x0020u), line: 451:2 ENC #define, value: (0x002), line: 181:2 ERASE #define, value: (0x0002u), line: 420:2 351 33:7 FAIL #define, value: (0x0080u), line: 453:2 FCTL1_ #define, value: (0x0128u), line: 409:2 410:2 FCTL2_ #define, value: (0x012Au), line: 411:2 412:2 FCTL3_ #define, value: (0x012Cu), line: 413:2 414:2 FN0 #define, value: (0x0001u), line: 426:2 FN1 #define, value: (0x0002u), line: 427:2 - 4e-core430G2553 - Page 163 FN2 #define, value: (0x0004u), line: 429:2 FN3 #define, value: (0x0008u), line: 432:2 FN4 #define, value: (0x0010u), line: 435:2 FN5 #define, value: (0x0020u), line: 437:2 FRKEY #define, value: (0x9600u), line: 416:2 FSSEL0 #define, value: (0x0040u), line: 438:2 FSSEL1 #define, value: (0x0080u), line: 439:2 FSSEL_0 #define, value: (0x0000u), line: 441:2 FSSEL_1 #define, value: (0x0040u), line: 442:2 FSSEL_2 #define, value: (0x0080u), line: 443:2 FSSEL_3 #define, value: (0x00C0u), line: 444:2 FWKEY #define, value: (0xA500u), line: 417:2 350 351 353 354 395 396 399 400 428 429 432 433 463 464 482 483 15:7 16:7 18:7 19:7 32:7 33:7 35:7 36:7 FXKEY #define, value: (0x3300u), line: 418:2 GIE #define, value: (0x0008u), line: 82:2 44:10 51:10 61:10 HALLOT #define, value: IALLOT, line: 830:5 1244:5 HCCOMMA #define, value: ICCOMMA, line: 832:5 1242:5 HCFETCH #define, value: ICFETCH, line: 833:5 941:5 1244:5 HCOMMA #define, value: ICOMMA, line: 831:5 1241:5 HCOUNT #define, value: ICOUNT, line: 677:5 935:5 1567:5 HCSTORE #define, value: ICSTORE, line: 835:5 1313:5 HFETCH #define, value: IFETCH, line: 834:5 964:5 1303:5 1568:5 HHERE #define, value: IHERE, line: 829:5 1243:5 HSTORE #define, value: ISTORE, line: 836:5 HTYPE #define, value: ITYPE, line: 678:5 1567:5 HWORD #define, value: IWORDC, line: 679:5 1244:5 ICFETCH #define, value: CFETCH, line: 446 598:5 941:5 1244:5 ICOUNT #define, value: COUNT, line: 553:5 585:5 935:5 1567:5 ID0 #define, value: (0x0040u), line: 578:2 ID1 #define, value: (0x0080u), line: 577:2 ID_0 #define, value: (0*0x40u), line: 589:2 ID_1 #define, value: (1*0x40u), line: 590:2 ID_2 #define, value: (2*0x40u), line: 591:2 ID_3 #define, value: (3*0x40u), line: 592:2 IE1_ #define, value: (0x0000u), line: 127:2 128:2 IE2_ #define, value: (0x0001u), line: 142:2 143:2 IFETCH #define, value: FETCH, line: 445 597:5 964:5 1303:5 1531:5 1532:5 1533:5 1568:5 37:6 IFG1_ #define, value: (0x0002u), line: 134:2 135:2 IFG2_ #define, value: (0x0003u), line: 150:2 151:2 INCH0 #define, value: (0x1000u), line: 223:2 INCH1 #define, value: (0x2000u), line: 224:2 INCH2 #define, value: (0x4000u), line: 225:2 INCH3 #define, value: (0x8000u), line: 226:2 INCH_0 #define, value: (0*0x1000u), line: 252:2 INCH_1 #define, value: (1*0x1000u), line: 253:2 INCH_10 #define, value: (10*0x1000u), line: 262:2 INCH_11 #define, value: (11*0x1000u), line: 263:2 INCH_12 #define, value: (12*0x1000u), line: 264:2 INCH_13 #define, value: (13*0x1000u), line: 265:2 INCH_14 #define, value: (14*0x1000u), line: 266:2 INCH_15 #define, value: (15*0x1000u), line: 267:2 INCH_2 #define, value: (2*0x1000u), line: 254:2 INCH_3 #define, value: (3*0x1000u), line: 255:2 INCH_4 #define, value: (4*0x1000u), line: 256:2 INCH_5 #define, value: (5*0x1000u), line: 257:2 INCH_6 #define, value: (6*0x1000u), line: 258:2 INCH_7 #define, value: (7*0x1000u), line: 259:2 INCH_8 #define, value: (8*0x1000u), line: 260:2 INCH_9 #define, value: (9*0x1000u), line: 261:2 INDEX #define, value: R8, line: 51:3 683 686 687 696 700 708 713 721 735 INFOEND #define, value: (0x10FF), line: 28:3 342 386 419 INFOSEG #define, value: (128), line: 36:3 363 364 INFOSTART #define, value: (0x1000), line: 27:3 340 384 417 IP #define, value: R5, line: 46:3 76 77 81 82 91 92 93 121 131 143 171 172 173 174 191 197 202 209 217 225 230 240 247 254 261 267 274 280 292 298 303 310 - 4e-core430G2553 - Page 164 367 404 489 497 503 510 517 522 527 532 537 543 548 553 558 563 568 579 591 600 607 615 627 662 662 663 670 671 689 699 702 712 715 723 731 737 766 797 813 830 847 870 885 905 947 958 1665:5 1696:5 1829:5 1836:5 1843:5 1850:5 1857:5 1867:5 1970:5 23:7 39:7 154:9 250:9 31:10 36:10 55:10 65:10 IRACL #define, value: R12, line: 67:3 748 756 764 777 782 796 IRACM #define, value: R13, line: 68:3 749 757 765 IRBT #define, value: W, line: 69:3 753 754 761 778 784 IROP1 #define, value: TOS, line: 64:3 754 779 781 789 IROP2L #define, value: R10, line: 65:3 745 756 758 772 786 IROP2M #define, value: R11, line: 66:3 752 757 759 771 779 781 787 789 795 ISREND #define, value: (0xFFDF), line: 34:3 335 ISRSTART #define, value: (0xFE00), line: 33:3 333 ISSH #define, value: (0x0100u), line: 219:2 ITYPE #define, value: TYP, line: 552:5 656:5 1158:5 1196:5 1567:5 1706:5 1707:5 1755:5 9:6 81:6 90:6 148:6 KEYV #define, value: (0x0002u), line: 447:2 LFXT1OF #define, value: (0x01), line: 336:2 LFXT1S0 #define, value: (0x10), line: 340:2 LFXT1S1 #define, value: (0x20), line: 341:2 LFXT1S_0 #define, value: (0x00), line: 350:2 LFXT1S_1 #define, value: (0x10), line: 351:2 LFXT1S_2 #define, value: (0x20), line: 352:2 LFXT1S_3 #define, value: (0x30), line: 353:2 LIMIT #define, value: R9, line: 52:3 682 684 685 687 701 714 722 736 LOCK #define, value: (0x0010u), line: 450:2 354 400 433 483 19:7 36:7 LOCKA #define, value: (0x0040u), line: 452:2 LPM0 #define, value: (CPUOFF), line: 91:2 61:10 LPM1 #define, value: (SCG0+CPUOFF), line: 92:2 LPM2 #define, value: (SCG1+CPUOFF), line: 93:2 LPM3 #define, value: (SCG1+SCG0+CPUOFF), line: 94:2 LPM4 #define, value: (SCG1+SCG0+OSCOFF+CPUOFF), line: 95:2 44:10 51:10 MAINSEG #define, value: (512), line: 35:3 363 MC0 #define, value: (0x0010u), line: 580:2 MC1 #define, value: (0x0020u), line: 579:2 MC_0 #define, value: (0*0x10u), line: 585:2 MC_1 #define, value: (1*0x10u), line: 586:2 MC_2 #define, value: (2*0x10u), line: 587:2 MC_3 #define, value: (3*0x10u), line: 588:2 MERAS #define, value: (0x0004u), line: 421:2 MOD0 #define, value: (0x01), line: 290:2 MOD1 #define, value: (0x02), line: 291:2 MOD2 #define, value: (0x04), line: 292:2 MOD3 #define, value: (0x08), line: 293:2 MOD4 #define, value: (0x10), line: 294:2 MSC #define, value: (0x080), line: 187:2 N #define, value: (0x0004u), line: 80:2 NMIIE #define, value: (0x10), line: 131:2 NMIIFG #define, value: (0x10), line: 140:2 NMI_VECTOR #define, value: (14 * 2u), line: 974:2 OFIE #define, value: (0x02), line: 130:2 OFIFG #define, value: (0x02), line: 137:2 OSCOFF #define, value: (0x0020u), line: 84:2 44:10 51:10 OUT #define, value: (0x0004u), line: 610:2 OUTMOD0 #define, value: (0x0020u), line: 607:2 OUTMOD1 #define, value: (0x0040u), line: 606:2 OUTMOD2 #define, value: (0x0080u), line: 605:2 OUTMOD_0 #define, value: (0*0x20u), line: 614:2 OUTMOD_1 #define, value: (1*0x20u), line: 615:2 - 4e-core430G2553 - Page 165 OUTMOD_2 #define, value: (2*0x20u), line: 616:2 OUTMOD_3 #define, value: (3*0x20u), line: 617:2 OUTMOD_4 #define, value: (4*0x20u), line: 618:2 OUTMOD_5 #define, value: (5*0x20u), line: 619:2 OUTMOD_6 #define, value: (6*0x20u), line: 620:2 OUTMOD_7 #define, value: (7*0x20u), line: 621:2 OWBIT #define, value: BIT3, line: 73:9 120:9 121:9 122:9 128:9 137:9 143:9 215:9 216:9 224:9 231:9 240:9 OWDIR #define, value: P2DIR, line: 71:9 120:9 128:9 137:9 215:9 224:9 240:9 OWIN #define, value: P2IN, line: 69:9 143:9 231:9 OWOUT #define, value: P2OUT, line: 70:9 121:9 216:9 OWREN #define, value: P2REN, line: 72:9 122:9 P1DIR_ #define, value: (0x0022u), line: 465:2 466:2 P1IES_ #define, value: (0x0024u), line: 469:2 470:2 P1IE_ #define, value: (0x0025u), line: 471:2 472:2 P1IFG_ #define, value: (0x0023u), line: 467:2 468:2 P1IN_ #define, value: (0x0020u), line: 461:2 462:2 P1OUT_ #define, value: (0x0021u), line: 463:2 464:2 P1REN_ #define, value: (0x0027u), line: 477:2 478:2 P1SEL2_ #define, value: (0x0041u), line: 475:2 476:2 P1SEL_ #define, value: (0x0026u), line: 473:2 474:2 P2CA0 #define, value: (0x04), line: 388:2 P2CA1 #define, value: (0x08), line: 389:2 P2CA2 #define, value: (0x10), line: 390:2 P2CA3 #define, value: (0x20), line: 391:2 P2CA4 #define, value: (0x40), line: 392:2 P2DIR_ #define, value: (0x002Au), line: 484:2 485:2 P2IES_ #define, value: (0x002Cu), line: 488:2 489:2 P2IE_ #define, value: (0x002Du), line: 490:2 491:2 P2IFG_ #define, value: (0x002Bu), line: 486:2 487:2 P2IN_ #define, value: (0x0028u), line: 480:2 481:2 P2OUT_ #define, value: (0x0029u), line: 482:2 483:2 P2REN_ #define, value: (0x002Fu), line: 496:2 497:2 P2SEL2_ #define, value: (0x0042u), line: 494:2 495:2 P2SEL_ #define, value: (0x002Eu), line: 492:2 493:2 P3DIR_ #define, value: (0x001Au), line: 508:2 509:2 P3IN_ #define, value: (0x0018u), line: 504:2 505:2 P3OUT_ #define, value: (0x0019u), line: 506:2 507:2 P3REN_ #define, value: (0x0010u), line: 514:2 515:2 P3SEL2_ #define, value: (0x0043u), line: 512:2 513:2 P3SEL_ #define, value: (0x001Bu), line: 510:2 511:2 PORIFG #define, value: (0x04), line: 138:2 PORT1_VECTOR #define, value: (2 * 2u), line: 963:2 PORT2_VECTOR #define, value: (3 * 2u), line: 964:2 PREFIXPROMPT #define, value: 0, line: 1136:5 1142:5 1151:5 PSP #define, value: R4, line: 45:3 68 74 75 118 119 128 129 139 140 168 169 189 190 201 206 207 213 214 215 221 222 223 224 229 239 244 245 251 252 258 259 260 265 266 271 272 279 296 297 307 309 319 366 373 403 408 456 457 488 496 501 502 507 508 509 514 521 526 531 572 583 611 623 635 648 649 668 685 688 709 719 720 727 728 745 764 771 772 795 804 805 812 821 822 829 835 836 846 859 860 868 874 875 883 890 891 946 954 955 972 973 1658:5 1692:5 1693:5 1695:5 1826:5 1827:5 1828:5 1833:5 1834:5 1835:5 1840:5 1841:5 1842:5 1847:5 1848:5 1849:5 1854:5 1855:5 1856:5 1861:5 1866:5 8:7 22:7 - 4e-core430G2553 - Page 166 113:9 114:9 Q #define, value: R12, line: 57:3 472 473 474 RAMEND #define, value: (0x0400), line: 30:3 1905:5 RAMSTART #define, value: (0x0200), line: 29:3 READ_ONLY #define, value: const, line: 50:2 462:2 481:2 505:2 523:2 645:2 689:2 714:2 941:2 943:2 945:2 947:2 949:2 951:2 953:2 955:2 REF2_5V #define, value: (0x040), line: 186:2 REFBURST #define, value: (0x100), line: 188:2 REFON #define, value: (0x020), line: 185:2 REFOUT #define, value: (0x200), line: 189:2 RESET_VECTOR #define, value: (15 * 2u), line: 975:2 RSEL0 #define, value: (0x01), line: 299:2 RSEL1 #define, value: (0x02), line: 300:2 RSEL2 #define, value: (0x04), line: 301:2 RSEL3 #define, value: (0x08), line: 302:2 RSP #define, value: SP, line: 42:3 81 246 253 273 278 681 682 683 700 701 713 714 729 730 735 736 44:10 RSTIFG #define, value: (0x08), line: 139:2 SCCI #define, value: (0x0400u), line: 603:2 SCG0 #define, value: (0x0040u), line: 85:2 44:10 51:10 SCG1 #define, value: (0x0080u), line: 86:2 44:10 51:10 SCS #define, value: (0x0800u), line: 602:2 SEGWRT #define, value: (0x0080u), line: 424:2 SELM0 #define, value: (0x40), line: 318:2 SELM1 #define, value: (0x80), line: 319:2 SELM_0 #define, value: (0x00), line: 331:2 SELM_1 #define, value: (0x40), line: 332:2 SELM_2 #define, value: (0x80), line: 333:2 SELM_3 #define, value: (0xC0), line: 334:2 SELS #define, value: (0x08), line: 315:2 SHS0 #define, value: (0x0400u), line: 221:2 SHS1 #define, value: (0x0800u), line: 222:2 SHS_0 #define, value: (0*0x400u), line: 247:2 SHS_1 #define, value: (1*0x400u), line: 248:2 SHS_2 #define, value: (2*0x400u), line: 249:2 SHS_3 #define, value: (3*0x400u), line: 250:2 SREF0 #define, value: (0x2000u), line: 193:2 SREF1 #define, value: (0x4000u), line: 194:2 SREF2 #define, value: (0x8000u), line: 195:2 SREF_0 #define, value: (0*0x2000u), line: 201:2 SREF_1 #define, value: (1*0x2000u), line: 202:2 SREF_2 #define, value: (2*0x2000u), line: 203:2 SREF_3 #define, value: (3*0x2000u), line: 204:2 SREF_4 #define, value: (4*0x2000u), line: 205:2 SREF_5 #define, value: (5*0x2000u), line: 206:2 SREF_6 #define, value: (6*0x2000u), line: 207:2 SREF_7 #define, value: (7*0x2000u), line: 208:2 T #define, value: R13, line: 58:3 TA0CCR0_ #define, value: (0x0172u), line: 534:2 535:2 TA0CCR1_ #define, value: (0x0174u), line: 536:2 537:2 TA0CCR2_ #define, value: (0x0176u), line: 538:2 539:2 TA0CCTL0_ #define, value: (0x0162u), line: 526:2 527:2 TA0CCTL1_ #define, value: (0x0164u), line: 528:2 529:2 TA0CCTL2_ #define, value: (0x0166u), line: 530:2 531:2 TA0CTL_ #define, value: (0x0160u), line: 524:2 525:2 TA0IV_ #define, value: (0x012Eu), line: 522:2 523:2 TA0IV_6 #define, value: (0x0006u), line: 635:2 TA0IV_8 #define, value: (0x0008u), line: 636:2 TA0IV_NONE #define, value: (0x0000u), line: 632:2 TA0IV_TACCR1 #define, value: (0x0002u), line: 633:2 TA0IV_TACCR2 #define, value: (0x0004u), line: 634:2 TA0IV_TAIFG #define, value: (0x000Au), line: 637:2 TA0R_ #define, value: (0x0170u), line: 532:2 533:2 TA1CCR0_ #define, value: (0x0192u), line: 656:2 657:2 TA1CCR1_ #define, value: (0x0194u), line: 658:2 659:2 TA1CCR2_ #define, value: (0x0196u), line: 660:2 661:2 TA1CCTL0_ #define, value: (0x0182u), line: 648:2 649:2 TA1CCTL1_ #define, value: (0x0184u), line: 650:2 651:2 TA1CCTL2_ #define, value: (0x0186u), line: 652:2 653:2 TA1CTL_ #define, value: (0x0180u), line: 646:2 647:2 TA1IV_ #define, value: (0x011Eu), line: 644:2 645:2 TA1IV_NONE #define, value: (0x0000u), line: 666:2 TA1IV_TACCR1 #define, value: (0x0002u), line: 667:2 - 4e-core430G2553 - Page 167 TA1IV_TACCR2 #define, value: (0x0004u), line: 668:2 TA1IV_TAIFG #define, value: (0x000Au), line: 669:2 TA1R_ #define, value: (0x0190u), line: 654:2 655:2 TACCR0 #define, value: TA0CCR0, line: 548:2 TACCR0_ #define, value: TA0CCR0_, line: 557:2 TACCR1 #define, value: TA0CCR1, line: 549:2 TACCR1_ #define, value: TA0CCR1_, line: 558:2 TACCR2 #define, value: TA0CCR2, line: 550:2 TACCR2_ #define, value: TA0CCR2_, line: 559:2 TACCTL0 #define, value: TA0CCTL0, line: 544:2 TACCTL0_ #define, value: TA0CCTL0_, line: 553:2 TACCTL1 #define, value: TA0CCTL1, line: 545:2 TACCTL1_ #define, value: TA0CCTL1_, line: 554:2 TACCTL2 #define, value: TA0CCTL2, line: 546:2 TACCTL2_ #define, value: TA0CCTL2_, line: 555:2 TACLR #define, value: (0x0004u), line: 581:2 TACTL #define, value: TA0CTL, line: 543:2 TACTL_ #define, value: TA0CTL_, line: 552:2 TAIE #define, value: (0x0002u), line: 582:2 TAIFG #define, value: (0x0001u), line: 583:2 TAIV #define, value: TA0IV, line: 542:2 TAIV_ #define, value: TA0IV_, line: 551:2 TAR #define, value: TA0R, line: 547:2 TAR_ #define, value: TA0R_, line: 556:2 TASSEL0 #define, value: (0x0100u), line: 576:2 TASSEL1 #define, value: (0x0200u), line: 575:2 TASSEL_0 #define, value: (0*0x100u), line: 593:2 TASSEL_1 #define, value: (1*0x100u), line: 594:2 TASSEL_2 #define, value: (2*0x100u), line: 595:2 TASSEL_3 #define, value: (3*0x100u), line: 596:2 TIMER0_A0_VECTOR #define, value: (9 * 2u), line: 969:2 TIMER0_A1_VECTOR #define, value: (8 * 2u), line: 968:2 TIMER1_A0_VECTOR #define, value: (13 * 2u), line: 973:2 TIMER1_A1_VECTOR #define, value: (12 * 2u), line: 972:2 TOS #define, value: R7, line: 48:3 67 68 75 76 119 120 129 130 140 141 142 169 170 190 195 201 207 208 215 216 222 223 238 239 245 246 252 253 259 260 265 266 272 273 278 279 291 291 296 297 302 302 308 309 320 322 366 374 376 379 381 384 386 398 403 409 412 414 417 419 431 458 467 477 486 488 496 501 502 507 509 515 516 521 526 531 536 541 542 547 552 557 562 562 567 573 576 578 584 588 590 598 599 599 604 604 605 605 606 612 614 624 626 636 646 649 667 668 686 688 708 709 720 721 722 728 729 730 754 765 779 781 789 796 808 812 823 827 829 837 839 840 844 846 863 869 878 884 892 897 902 902 903 903 904 945 946 955 956 973 57:4 1656:5 1657:5 1658:5 1660:5 1662:5 1693:5 1694:5 1826:5 1828:5 1833:5 1835:5 1840:5 1842:5 1847:5 1849:5 1854:5 1856:5 1861:5 1863:5 1865:5 1969:5 9:7 11:7 17:7 22:7 - 4e-core430G2553 - Page 168 114:9 117:9 145:9 209:9 222:9 233:9 234:9 UC0IE #define, value: IE2, line: 144:2 UC0IFG #define, value: IFG2, line: 152:2 UC7BIT #define, value: (0x10), line: 726:2 UCA0ABCTL_ #define, value: (0x005Du), line: 692:2 693:2 UCA0BR0_ #define, value: (0x0062u), line: 680:2 681:2 UCA0BR1_ #define, value: (0x0063u), line: 682:2 683:2 UCA0CTL0_ #define, value: (0x0060u), line: 676:2 677:2 UCA0CTL1_ #define, value: (0x0061u), line: 678:2 679:2 UCA0IRRCTL_ #define, value: (0x005Fu), line: 696:2 697:2 UCA0IRTCTL_ #define, value: (0x005Eu), line: 694:2 695:2 UCA0MCTL_ #define, value: (0x0064u), line: 684:2 685:2 UCA0RXBUF_ #define, value: (0x0066u), line: 688:2 689:2 UCA0RXIE #define, value: (0x01), line: 145:2 30:10 35:10 UCA0RXIFG #define, value: (0x01), line: 153:2 952 974 UCA0STAT_ #define, value: (0x0065u), line: 686:2 687:2 UCA0TXBUF_ #define, value: (0x0067u), line: 690:2 691:2 UCA0TXIE #define, value: (0x02), line: 146:2 UCA0TXIFG #define, value: (0x02), line: 154:2 943 UCA10 #define, value: (0x80), line: 738:2 UCABDEN #define, value: (0x01), line: 862:2 UCADDR #define, value: (0x02), line: 816:2 UCALIE #define, value: (0x01), line: 827:2 UCALIFG #define, value: (0x01), line: 835:2 UCB0BR0_ #define, value: (0x006Au), line: 705:2 706:2 UCB0BR1_ #define, value: (0x006Bu), line: 707:2 708:2 UCB0CTL0_ #define, value: (0x0068u), line: 701:2 702:2 UCB0CTL1_ #define, value: (0x0069u), line: 703:2 704:2 UCB0I2CIE_ #define, value: (0x006Cu), line: 709:2 710:2 UCB0I2COA_ #define, value: (0x0118u), line: 717:2 718:2 UCB0I2CSA_ #define, value: (0x011Au), line: 719:2 720:2 UCB0RXBUF_ #define, value: (0x006Eu), line: 713:2 714:2 UCB0RXIE #define, value: (0x04), line: 147:2 UCB0RXIFG #define, value: (0x04), line: 155:2 UCB0STAT_ #define, value: (0x006Du), line: 711:2 712:2 UCB0TXBUF_ #define, value: (0x006Fu), line: 715:2 716:2 UCB0TXIE #define, value: (0x08), line: 148:2 UCB0TXIFG #define, value: (0x08), line: 156:2 UCBBUSY #define, value: (0x10), line: 831:2 UCBRF0 #define, value: (0x10), line: 778:2 UCBRF1 #define, value: (0x20), line: 777:2 UCBRF2 #define, value: (0x40), line: 776:2 UCBRF3 #define, value: (0x80), line: 775:2 UCBRF_0 #define, value: (0x00), line: 784:2 UCBRF_1 #define, value: (0x10), line: 785:2 UCBRF_10 #define, value: (0xA0), line: 794:2 UCBRF_11 #define, value: (0xB0), line: 795:2 UCBRF_12 #define, value: (0xC0), line: 796:2 UCBRF_13 #define, value: (0xD0), line: 797:2 UCBRF_14 #define, value: (0xE0), line: 798:2 UCBRF_15 #define, value: (0xF0), line: 799:2 UCBRF_2 #define, value: (0x20), line: 786:2 UCBRF_3 #define, value: (0x30), line: 787:2 UCBRF_4 #define, value: (0x40), line: 788:2 UCBRF_5 #define, value: (0x50), line: 789:2 UCBRF_6 #define, value: (0x60), line: 790:2 UCBRF_7 #define, value: (0x70), line: 791:2 UCBRF_8 #define, value: (0x80), line: 792:2 UCBRF_9 #define, value: (0x90), line: 793:2 UCBRK #define, value: (0x08), line: 814:2 UCBRKIE #define, value: (0x10), line: 751:2 UCBRS0 #define, value: (0x02), line: 781:2 UCBRS1 #define, value: (0x04), line: 780:2 UCBRS2 #define, value: (0x08), line: 779:2 UCBRS_0 #define, value: (0x00), line: 801:2 UCBRS_1 #define, value: (0x02), line: 802:2 UCBRS_2 #define, value: (0x04), line: 803:2 UCBRS_3 #define, value: (0x06), line: 804:2 UCBRS_4 #define, value: (0x08), line: 805:2 UCBRS_5 #define, value: (0x0A), line: 806:2 UCBRS_6 #define, value: (0x0C), line: 807:2 UCBRS_7 #define, value: (0x0E), line: 808:2 UCBTOE #define, value: (0x04), line: 860:2 UCBUSY #define, value: (0x01), line: 817:2 UCCKPH #define, value: (0x80), line: 733:2 UCCKPL #define, value: (0x40), line: 734:2 UCDELIM0 #define, value: (0x10), line: 858:2 - 4e-core430G2553 - Page 169 UCDELIM1 #define, value: (0x20), line: 857:2 UCDORM #define, value: (0x08), line: 752:2 UCFE #define, value: (0x40), line: 811:2 UCGC #define, value: (0x20), line: 830:2 UCGCEN #define, value: (0x8000u), line: 864:2 UCIDLE #define, value: (0x02), line: 818:2 UCIREN #define, value: (0x01), line: 844:2 UCIRRXFE #define, value: (0x01), line: 853:2 UCIRRXFL0 #define, value: (0x04), line: 851:2 UCIRRXFL1 #define, value: (0x08), line: 850:2 UCIRRXFL2 #define, value: (0x10), line: 849:2 UCIRRXFL3 #define, value: (0x20), line: 848:2 UCIRRXFL4 #define, value: (0x40), line: 847:2 UCIRRXFL5 #define, value: (0x80), line: 846:2 UCIRRXPL #define, value: (0x02), line: 852:2 UCIRTXCLK #define, value: (0x02), line: 843:2 UCIRTXPL0 #define, value: (0x04), line: 842:2 UCIRTXPL1 #define, value: (0x08), line: 841:2 UCIRTXPL2 #define, value: (0x10), line: 840:2 UCIRTXPL3 #define, value: (0x20), line: 839:2 UCIRTXPL4 #define, value: (0x40), line: 838:2 UCIRTXPL5 #define, value: (0x80), line: 837:2 UCLISTEN #define, value: (0x80), line: 810:2 UCMM #define, value: (0x20), line: 740:2 UCMODE0 #define, value: (0x02), line: 729:2 UCMODE1 #define, value: (0x04), line: 728:2 UCMODE_0 #define, value: (0x00), line: 742:2 UCMODE_1 #define, value: (0x02), line: 743:2 UCMODE_2 #define, value: (0x04), line: 744:2 UCMODE_3 #define, value: (0x06), line: 745:2 UCMSB #define, value: (0x20), line: 725:2 UCMST #define, value: (0x08), line: 735:2 UCNACKIE #define, value: (0x08), line: 824:2 UCNACKIFG #define, value: (0x08), line: 832:2 UCOA0 #define, value: (0x0001u), line: 874:2 UCOA1 #define, value: (0x0002u), line: 873:2 UCOA2 #define, value: (0x0004u), line: 872:2 UCOA3 #define, value: (0x0008u), line: 871:2 UCOA4 #define, value: (0x0010u), line: 870:2 UCOA5 #define, value: (0x0020u), line: 869:2 UCOA6 #define, value: (0x0040u), line: 868:2 UCOA7 #define, value: (0x0080u), line: 867:2 UCOA8 #define, value: (0x0100u), line: 866:2 UCOA9 #define, value: (0x0200u), line: 865:2 UCOE #define, value: (0x20), line: 812:2 UCOS16 #define, value: (0x01), line: 782:2 UCPAR #define, value: (0x40), line: 724:2 UCPE #define, value: (0x10), line: 813:2 UCPEN #define, value: (0x80), line: 723:2 UCRXEIE #define, value: (0x20), line: 750:2 UCRXERR #define, value: (0x04), line: 815:2 UCSA0 #define, value: (0x0001u), line: 885:2 UCSA1 #define, value: (0x0002u), line: 884:2 UCSA2 #define, value: (0x0004u), line: 883:2 UCSA3 #define, value: (0x0008u), line: 882:2 UCSA4 #define, value: (0x0010u), line: 881:2 UCSA5 #define, value: (0x0020u), line: 880:2 UCSA6 #define, value: (0x0040u), line: 879:2 UCSA7 #define, value: (0x0080u), line: 878:2 UCSA8 #define, value: (0x0100u), line: 877:2 UCSA9 #define, value: (0x0200u), line: 876:2 UCSCLLOW #define, value: (0x40), line: 829:2 UCSLA10 #define, value: (0x40), line: 739:2 UCSPB #define, value: (0x08), line: 727:2 UCSSEL0 #define, value: (0x40), line: 749:2 UCSSEL1 #define, value: (0x80), line: 748:2 UCSSEL_0 #define, value: (0x00), line: 770:2 UCSSEL_1 #define, value: (0x40), line: 771:2 UCSSEL_2 #define, value: (0x80), line: 772:2 UCSSEL_3 #define, value: (0xC0), line: 773:2 UCSTOE #define, value: (0x08), line: 859:2 UCSTPIE #define, value: (0x04), line: 825:2 UCSTPIFG #define, value: (0x04), line: 833:2 UCSTTIE #define, value: (0x02), line: 826:2 UCSTTIFG #define, value: (0x02), line: 834:2 UCSWRST #define, value: (0x01), line: 755:2 UCSYNC #define, value: (0x01), line: 730:2 UCTR #define, value: (0x10), line: 766:2 - 4e-core430G2553 - Page 170 UCTXADDR #define, value: (0x04), line: 753:2 UCTXBRK #define, value: (0x02), line: 754:2 UCTXNACK #define, value: (0x08), line: 767:2 UCTXSTP #define, value: (0x04), line: 768:2 UCTXSTT #define, value: (0x02), line: 769:2 USCIAB0RX_VECTOR #define, value: (7 * 2u), line: 967:2 70:10 USCIAB0TX_VECTOR #define, value: (6 * 2u), line: 966:2 USERFLASHEND #define, value: (0xD7FF), line: 32:3 327 361 381 414 1895:5 142:6 USERFLASHSTART #define, value: (0xC000), line: 31:3 325 359 379 412 205:5 1891:5 142:6 V #define, value: (0x0100u), line: 81:2 W #define, value: R6, line: 47:3 67 69 77 77 82 82 92 93 93 120 121 121 130 131 131 141 143 143 151 151 152 170 172 174 174 191 191 197 197 202 202 206 208 209 209 213 216 217 217 221 224 225 225 230 230 240 240 247 247 254 254 261 261 267 267 274 274 280 280 292 292 298 298 303 303 307 308 310 310 319 320 322 325 327 333 335 340 342 352 359 361 363 364 367 367 373 376 398 404 404 408 409 431 456 469 475 476 479 480 489 489 497 497 503 503 510 510 514 515 516 517 517 522 522 527 527 532 532 537 537 543 543 548 548 553 553 558 558 563 563 568 568 572 575 575 578 579 579 583 587 590 591 591 600 600 607 607 611 612 615 615 623 624 627 627 635 636 663 663 671 671 689 689 702 702 715 715 723 723 731 731 737 737 753 754 761 766 766 778 784 797 797 805 808 809 813 813 821 825 826 830 830 835 839 842 843 847 847 860 863 865 868 870 870 875 878 880 883 885 885 890 894 905 905 947 947 958 958 1659:5 1663:5 1665:5 1665:5 1694:5 1695:5 1696:5 1696:5 1829:5 1829:5 1836:5 1836:5 1843:5 1843:5 1850:5 1850:5 1857:5 1857:5 1867:5 1867:5 1970:5 1970:5 8:7 11:7 17:7 23:7 23:7 29:7 34:7 39:7 39:7 154:9 154:9 250:9 250:9 31:10 31:10 36:10 36:10 55:10 55:10 65:10 65:10 - 4e-core430G2553 - Page 171 WAIT #define, value: (0x0008u), line: 449:2 WDTCNTCL #define, value: (0x0008u), line: 898:2 WDTCTL_ #define, value: (0x0120u), line: 892:2 893:2 WDTHOLD #define, value: (0x0080u), line: 902:2 WDTIE #define, value: (0x01), line: 129:2 WDTIFG #define, value: (0x01), line: 136:2 WDTIS0 #define, value: (0x0001u), line: 895:2 WDTIS1 #define, value: (0x0002u), line: 896:2 WDTNMI #define, value: (0x0020u), line: 900:2 WDTNMIES #define, value: (0x0040u), line: 901:2 WDTPW #define, value: (0x5A00u), line: 904:2 WDTSSEL #define, value: (0x0004u), line: 897:2 WDTTMSEL #define, value: (0x0010u), line: 899:2 WDT_ADLY_1000 #define, value: (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL), line: 913:2 WDT_ADLY_16 #define, value: (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1), line: 915:2 WDT_ADLY_1_9 #define, value: (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0), line: 916:2 WDT_ADLY_250 #define, value: (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0), line: 914:2 WDT_ARST_1000 #define, value: (WDTPW+WDTCNTCL+WDTSSEL), line: 924:2 WDT_ARST_16 #define, value: (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1), line: 926:2 WDT_ARST_1_9 #define, value: (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0), line: 927:2 WDT_ARST_250 #define, value: (WDTPW+WDTCNTCL+WDTSSEL+WDTIS0), line: 925:2 WDT_MDLY_0_064 #define, value: (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0), line: 911:2 WDT_MDLY_0_5 #define, value: (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1), line: 910:2 WDT_MDLY_32 #define, value: (WDTPW+WDTTMSEL+WDTCNTCL), line: 908:2 WDT_MDLY_8 #define, value: (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0), line: 909:2 WDT_MRST_0_064 #define, value: (WDTPW+WDTCNTCL+WDTIS1+WDTIS0), line: 922:2 WDT_MRST_0_5 #define, value: (WDTPW+WDTCNTCL+WDTIS1), line: 921:2 WDT_MRST_32 #define, value: (WDTPW+WDTCNTCL), line: 919:2 WDT_MRST_8 #define, value: (WDTPW+WDTCNTCL+WDTIS0), line: 920:2 WDT_VECTOR #define, value: (10 * 2u), line: 970:2 WRT #define, value: (0x0040u), line: 422:2 396 429 464 16:7 X #define, value: R10, line: 55:3 457 471 472 479 804 806 810 822 825 836 840 841 843 859 861 866 869 874 876 881 884 891 894 896 125:9 125:9 131:9 131:9 140:9 140:9 151:9 151:9 219:9 219:9 228:9 228:9 237:9 237:9 246:9 246:9 XCAP0 #define, value: (0x04), line: 338:2 XCAP1 #define, value: (0x08), line: 339:2 XCAP_0 #define, value: (0x00), line: 345:2 XCAP_1 #define, value: (0x04), line: 346:2 XCAP_2 #define, value: (0x08), line: 347:2 XCAP_3 #define, value: (0x0C), line: 348:2 XT2OF #define, value: (0x02), line: 337:2 XT2OFF #define, value: (0x80), line: 306:2 XT2S0 #define, value: (0x40), line: 342:2 XT2S1 #define, value: (0x80), line: 343:2 XT2S_0 #define, value: (0x00), line: 355:2 XT2S_1 #define, value: (0x40), line: 356:2 XT2S_2 #define, value: (0x80), line: 357:2 XT2S_3 #define, value: (0xC0), line: 358:2 XTS #define, value: (0x40), line: 305:2 Y #define, value: R11, line: 56:3 471 474 475 Z #define, value: (0x0002u), line: 79:2 __430X_CORE__ #define, value: 1, line: 0 __430_CORE__ #define, value: 0, line: 0 __A430__ #define, value: 1, line: 0 __BUILD_NUMBER__ #define, line: 0 __CORE__ #define, value: 0, line: 0 __DATE__ #define, line: 0 49 __FILE__ #define, line: 0 __IAR_SYSTEMS_ASM #define, line: 0 __IAR_SYSTEMS_ASM__ #define, line: 0 __LINE__ #define, line: 0 __MSP430G2553 #define, value: , line: 16:2 __MSP430G2553__ #define, value: 1, line: 0 __MSP430_HAS_ADC10__ #define, value: , line: 161:2 __MSP430_HAS_BC2__ #define, value: , line: 279:2 __MSP430_HAS_CAPLUS__ #define, value: , line: 363:2 __MSP430_HAS_FLASH2__ #define, value: , line: 407:2 __MSP430_HAS_PORT1_R__ #define, value: , line: 458:2 __MSP430_HAS_PORT2_R__ #define, value: , line: 459:2 __MSP430_HAS_PORT3_R__ #define, value: , line: 502:2 __MSP430_HAS_T1A3__ #define, value: , line: 642:2 - 4e-core430G2553 - Page 172 __MSP430_HAS_TA3__ #define, value: , line: 520:2 __MSP430_HAS_USCI__ #define, value: , line: 674:2 __MSP430_HAS_WDT__ #define, value: , line: 890:2 __SUBVERSION__ #define, line: 0 __TID__ #define, line: 0 24:2 __TIME__ #define, line: 0 49 __VER__ #define, line: 0 __msp430 #define, value: , line: 9:1 Segment Type Mode ---------------------------------------- CODE UNTYPED REL Label Mode Type Segment Value/Offset ------------------------------------------------------------------------------ ABBS REL CONST PUB UNTYP. CODE B5C ABORT REL CONST PUB UNTYP. CODE 1550 ABORTQUOTE REL CONST PUB UNTYP. CODE 157C ACC1 REL CONST UNTYP. CODE E2A ACC3 REL CONST UNTYP. CODE E60 ACC4 REL CONST UNTYP. CODE E6C ACC5 REL CONST UNTYP. CODE E70 ACCEPT REL CONST PUB UNTYP. CODE E20 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 ADRTOIN REL CONST PUB UNTYP. CODE 11D0 AGAIN REL CONST PUB UNTYP. CODE 17E0 ALIGNED REL CONST PUB UNTYP. CODE 85E ALIGNN REL CONST PUB UNTYP. CODE 844 ALLOT REL CONST PUB UNTYP. CODE 10DE ANDD REL CONST PUB UNTYP. CODE 412 APP REL CONST PUB UNTYP. CODE A1C APPCRC REL CONST PUB UNTYP. CODE 1E84 APPU0 REL CONST PUB UNTYP. CODE B28 ATXY REL CONST PUB UNTYP. CODE 1C0A AppU0 ABS CONST EXT [013] UNTYP. __EXTERNS Solved Extern BACKSLASH REL CONST PUB UNTYP. CODE 1B7C BASE REL CONST PUB UNTYP. CODE 9AC BCSCTL1 ABS CONST UNTYP. ASEG 57 BCSCTL2 ABS CONST UNTYP. ASEG 58 BCSCTL3 ABS CONST UNTYP. ASEG 53 BEGIN REL CONST PUB UNTYP. CODE 17BA BELL REL CONST PUB UNTYP. CODE 1BC6 BIN REL CONST PUB UNTYP. CODE 1C46 BLANK REL CONST PUB UNTYP. CODE AA8 BOOT REL CONST PUB UNTYP. CODE 1EF0 BOOTIP REL CONST PUB UNTYP. CODE 1EF2 BRACCHAR REL CONST PUB UNTYP. CODE 15C0 BRACTICK REL CONST PUB UNTYP. CODE 1728 BUILDS REL CONST PUB UNTYP. CODE 1618 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 CALLL REL CONST PUB UNTYP. CODE 1E32 CAPD ABS CONST UNTYP. ASEG 5B CAPITALIZE REL CONST PUB UNTYP. CODE 12FC CAPS REL CONST PUB UNTYP. CODE A28 CAPS1 REL CONST UNTYP. CODE 1312 CAPS2 REL CONST UNTYP. CODE 1320 CCOMMA REL CONST PUB UNTYP. CODE 1102 CCRC REL CONST PUB UNTYP. CODE 1B08 CELL REL CONST PUB UNTYP. CODE 874 CELLPLUS REL CONST PUB UNTYP. CODE 882 CELLS REL CONST PUB UNTYP. CODE 892 CEXIT REL CONST PUB UNTYP. CODE 938 CFETCH REL CONST PUB UNTYP. CODE 236 - 4e-core430G2553 - Page 173 CHARPLUS REL CONST PUB UNTYP. CODE 89E CHARR REL CONST PUB UNTYP. CODE 15AA CHARS REL CONST PUB UNTYP. CODE 8AA CMOVE REL CONST PUB UNTYP. CODE 6EC CMOVEUP REL CONST PUB UNTYP. CODE 710 CMOVE_1 REL CONST UNTYP. CODE 6F6 CMOVE_X REL CONST UNTYP. CODE 700 CMOVU_1 REL CONST UNTYP. CODE 71E CMOVU_X REL CONST UNTYP. CODE 72A CODEADR REL CONST PUB UNTYP. CODE 1E20 CODEE REL CONST PUB UNTYP. CODE 1E02 COLD REL CONST PUB UNTYP. CODE 1F4E COLDIP REL CONST PUB UNTYP. CODE 1F50 COLON REL CONST PUB UNTYP. CODE 1704 COMMA REL CONST PUB UNTYP. CODE 10EC COMMABRANCH REL CONST PUB UNTYP. CODE 94E COMMACALL REL CONST PUB UNTYP. CODE 8F4 COMMACF REL CONST PUB UNTYP. CODE 8DC COMMADEST REL CONST PUB UNTYP. CODE 95C COMMAJMP REL CONST PUB UNTYP. CODE 908 COMMANONE REL CONST PUB UNTYP. CODE 986 COMMAXT REL CONST PUB UNTYP. CODE 8C4 CONSTANT REL CONST PUB UNTYP. CODE 90 COR REL CONST PUB UNTYP. CODE AF0 CORPOWERON ABS CONST UNTYP. CODE 186 CORREST ABS CONST UNTYP. CODE 18E COUNT REL CONST PUB UNTYP. CODE D44 CR REL CONST PUB UNTYP. CODE D6E CRC REL CONST PUB UNTYP. CODE 1B2C CREATE REL CONST PUB UNTYP. CODE 162E CSTORE REL CONST PUB UNTYP. CODE 244 CamelForthEnd REL CONST UNTYP. CODE 228E DABS REL CONST PUB UNTYP. CODE BA2 DCOCTL ABS CONST UNTYP. ASEG 56 DDP REL CONST PUB UNTYP. CODE 9C4 DECIMAL REL CONST PUB UNTYP. CODE 10A4 DEPTH REL CONST PUB UNTYP. CODE 190A DIGITQ REL CONST PUB UNTYP. CODE 134C DIV1 REL CONST UNTYP. CODE 69A DIV2 REL CONST UNTYP. CODE 6A0 DIV3 REL CONST UNTYP. CODE 6B4 DIV4 REL CONST UNTYP. CODE 6B6 DIVIDE REL CONST UNTYP. CODE 694 DNEG1 REL CONST UNTYP. CODE B98 DNEGATE REL CONST PUB UNTYP. CODE B70 DO REL CONST PUB UNTYP. CODE 1844 DOALIAS REL CONST PUB UNTYP. CODE D0 DOCODE REL CONST UNTYP. CODE Not solved DOCOLON REL CONST PUB UNTYP. CODE 66 DOCON REL CONST PUB UNTYP. CODE 98 DOCR REL CONST PUB UNTYP. CODE D58 DOEMIT REL CONST PUB UNTYP. CODE 7C0 DOES REL CONST PUB UNTYP. CODE 1662 DOKEY REL CONST PUB UNTYP. CODE 7DC DOROM REL CONST PUB UNTYP. CODE A4 DOT REL CONST PUB UNTYP. CODE 1080 DOTBOOTVERSION REL CONST PUB UNTYP. CODE 1E4A DOTCOLD REL CONST PUB UNTYP. CODE 1F38 DOTERRN REL CONST PUB UNTYP. CODE DE2 DOTQUOTE REL CONST PUB UNTYP. CODE F4C DOTS REL CONST PUB UNTYP. CODE 1AC8 DOTS1 REL CONST UNTYP. CODE 1AF8 DOTS2 REL CONST UNTYP. CODE 1B06 DOTSTATUS REL CONST PUB UNTYP. CODE 14D8 DOTVER REL CONST PUB UNTYP. CODE 1B90 DOTWOCON REL CONST PUB UNTYP. CODE 1B66 DOUSER REL CONST PUB UNTYP. CODE C0 DOVAR REL CONST PUB UNTYP. CODE 98 DROP REL CONST PUB UNTYP. CODE 116 DTOI REL CONST PUB UNTYP. CODE 370 DTOI_BYTE REL CONST UNTYP. CODE 3A4 DTOI_END REL CONST UNTYP. CODE 3AA DTOI_LOOP REL CONST UNTYP. CODE 37A DTOI_WORD REL CONST UNTYP. CODE 392 DTOI_X REL CONST UNTYP. CODE 3BC DUMP REL CONST PUB UNTYP. CODE 1A5C DUP REL CONST PUB UNTYP. CODE F0 ELSS REL CONST PUB UNTYP. CODE 179E - 4e-core430G2553 - Page 174 EMIT REL CONST PUB UNTYP. CODE 80C EMITLOOPx REL CONST UNTYP. CODE 7C2 ENDCODE REL CONST PUB UNTYP. CODE 1E46 ENDLOOP REL CONST PUB UNTYP. CODE 1860 ENVIRONMENTQ REL CONST PUB UNTYP. CODE 1928 EQUAL REL CONST PUB UNTYP. CODE 50E ESC0 REL CONST UNTYP. CODE 1C31 ESC1 REL CONST UNTYP. CODE 1C34 ESCPAR REL CONST PUB UNTYP. CODE 1BD0 EVALUATE REL CONST PUB UNTYP. CODE 14B6 EXECUTE REL CONST PUB UNTYP. CODE 38 EXIT REL CONST PUB UNTYP. CODE 5E FACTORY REL CONST PUB UNTYP. CODE 1F76 FACTORYIP REL CONST PUB UNTYP. CODE 1F78 FALSE REL CONST PUB UNTYP. CODE 1C68 FCTL1 ABS CONST UNTYP. ASEG 128 FCTL2 ABS CONST UNTYP. ASEG 12A FCTL3 ABS CONST UNTYP. ASEG 12C FETCH REL CONST PUB UNTYP. CODE 216 FILL REL CONST PUB UNTYP. CODE 6C8 FILL_1 REL CONST UNTYP. CODE 6D2 FILL_X REL CONST UNTYP. CODE 6DC FIND REL CONST PUB UNTYP. CODE 129C FIND1 REL CONST UNTYP. CODE 12A2 FIND2 REL CONST UNTYP. CODE 12BA FIND3 REL CONST UNTYP. CODE 12D8 FLALIGNED REL CONST PUB UNTYP. CODE 194A FLERASE REL CONST PUB UNTYP. CODE 25E FLE_1 REL CONST UNTYP. CODE 264 FLE_INFO REL CONST UNTYP. CODE 280 FLE_OK REL CONST UNTYP. CODE 28C FLE_VEC REL CONST UNTYP. CODE 274 FLE_X REL CONST UNTYP. CODE 2C4 FL_INFO REL CONST UNTYP. CODE 2BE FMMOD1 REL CONST UNTYP. CODE C26 FMSLASHMOD REL CONST PUB UNTYP. CODE C00 FORTHPRO REL CONST PUB UNTYP. CODE 1FAC GREATER REL CONST PUB UNTYP. CODE 544 HEADR REL CONST PUB UNTYP. CODE 15EA HERE REL CONST PUB UNTYP. CODE 10CC HEX REL CONST PUB UNTYP. CODE 10B8 HIDE REL CONST PUB UNTYP. CODE 16B4 HOLD REL CONST PUB UNTYP. CODE FC4 HP REL CONST PUB UNTYP. CODE 9EC IALLOT REL CONST PUB UNTYP. CODE 112E ICCOMMA REL CONST PUB UNTYP. CODE 1154 ICOMMA REL CONST PUB UNTYP. CODE 113C ICSTORE REL CONST PUB UNTYP. CODE 324 ICST_INFO REL CONST UNTYP. CODE 338 ICST_OK REL CONST UNTYP. CODE 344 ICST_RAM REL CONST UNTYP. CODE 354 IDP REL CONST PUB UNTYP. CODE A02 IE1 ABS CONST UNTYP. ASEG 0 IE2 ABS CONST UNTYP. ASEG 1 IFF REL CONST PUB UNTYP. CODE 1776 IFG1 ABS CONST UNTYP. ASEG 2 IFG2 ABS CONST UNTYP. ASEG 3 IHERE REL CONST PUB UNTYP. CODE 111C II REL CONST PUB UNTYP. CODE 61A IMMEDIATE REL CONST PUB UNTYP. CODE 16EE IMMEDQ REL CONST PUB UNTYP. CODE 1284 INFOB REL CONST PUB UNTYP. CODE AFE INFOC REL CONST PUB UNTYP. CODE B0C INFOD REL CONST PUB UNTYP. CODE B1A INTER1 REL CONST UNTYP. CODE 1450 INTER2 REL CONST UNTYP. CODE 147C INTER3 REL CONST UNTYP. CODE 147E INTER4 REL CONST UNTYP. CODE 1482 INTER5 REL CONST UNTYP. CODE 148E INTER6 REL CONST UNTYP. CODE 14A2 INTER8 REL CONST UNTYP. CODE 14A2 INTER9 REL CONST UNTYP. CODE 14A6 INTERPRET REL CONST PUB UNTYP. CODE 1444 INTERRUPT REL CONST PUB UNTYP. CODE 2114 INVERT REL CONST PUB UNTYP. CODE 442 IRXOFF REL CONST PUB UNTYP. CODE 222A IRXON REL CONST PUB UNTYP. CODE 2216 ISQUOTE REL CONST PUB UNTYP. CODE EF2 - 4e-core430G2553 - Page 175 ISTORE REL CONST PUB UNTYP. CODE 2D0 IST_INFO REL CONST UNTYP. CODE 2E8 IST_OK REL CONST UNTYP. CODE 2F4 IST_RAM REL CONST UNTYP. CODE 304 IST_X REL CONST UNTYP. CODE 316 IST_X2 REL CONST UNTYP. CODE 2028 ITHERE REL CONST PUB UNTYP. CODE 1E64 ITOD REL CONST PUB UNTYP. CODE 738 IWORD REL CONST PUB UNTYP. CODE F62 IWORD1 REL CONST UNTYP. CODE F66 IWORDC REL CONST PUB UNTYP. CODE F74 JJ REL CONST PUB UNTYP. CODE 630 KEY REL CONST PUB UNTYP. CODE 7FA KEYLOOPx REL CONST UNTYP. CODE 7DE KEYQ REL CONST PUB UNTYP. CODE 81E L$002 REL CONST UNTYP. CODE 66A L$01 REL CONST UNTYP. CODE 672 L0 REL CONST PUB UNTYP. CODE A6E LATEST REL CONST PUB UNTYP. CODE 9E2 LDUMP1 REL CONST UNTYP. CODE 1A66 LDUMP2 REL CONST UNTYP. CODE 1A80 LDUMP3 REL CONST UNTYP. CODE 1A9E LEAV REL CONST PUB UNTYP. CODE 18A6 LEFTBRACKET REL CONST PUB UNTYP. CODE 1690 LESS REL CONST PUB UNTYP. CODE 530 LESSNUM REL CONST PUB UNTYP. CODE FDC LFROM REL CONST PUB UNTYP. CODE 182C LITER1 REL CONST UNTYP. CODE 1340 LITERAL REL CONST PUB UNTYP. CODE 132E LOO REL CONST PUB UNTYP. CODE 187E LOOP1 REL CONST UNTYP. CODE 1866 LOOP2 REL CONST UNTYP. CODE 1874 LP REL CONST PUB UNTYP. CODE 9F6 LPM_WAKE REL CONST PUB UNTYP. CODE 2240 LSHIFT REL CONST PUB UNTYP. CODE 4AE LSH_1 REL CONST UNTYP. CODE 4B8 LSH_X REL CONST UNTYP. CODE 4BE LSTACK ABS CONST EXT [003] UNTYP. __EXTERNS Solved Extern MACU REL CONST UNTYP. CODE 666 MARKER REL CONST PUB UNTYP. CODE 1968 MAX REL CONST PUB UNTYP. CODE C98 MAX1 REL CONST UNTYP. CODE CA4 MCLK ABS CONST UNTYP. CODE 8 MEM REL CONST PUB UNTYP. CODE 1D84 MEMBOT REL CONST PUB UNTYP. CODE 1D6A MEMTOP REL CONST PUB UNTYP. CODE 1D78 MIN REL CONST PUB UNTYP. CODE CB0 MIN1 REL CONST UNTYP. CODE CBC MINUS REL CONST PUB UNTYP. CODE 3FE MODD REL CONST PUB UNTYP. CODE C64 MOVE REL CONST PUB UNTYP. CODE 18DE MOVE1 REL CONST UNTYP. CODE 18FA MOVE2 REL CONST UNTYP. CODE 18FE MPLUS REL CONST PUB UNTYP. CODE 3E8 MPYU REL CONST UNTYP. CODE 662 MS REL CONST PUB UNTYP. CODE 1CB4 MSTAR REL CONST PUB UNTYP. CODE BB0 NEGATE REL CONST PUB UNTYP. CODE 454 NEQUAL REL CONST PUB UNTYP. CODE 7B4 NEWEST REL CONST PUB UNTYP. CODE A10 NEWLINE REL CONST PUB UNTYP. CODE A58 NFATOCFA REL CONST PUB UNTYP. CODE 126A NFATOLFA REL CONST PUB UNTYP. CODE 1254 NINIT REL CONST PUB UNTYP. CODE AE4 NIP REL CONST PUB UNTYP. CODE 170 NODUP REL CONST UNTYP. CODE 10A NOOP REL CONST PUB UNTYP. CODE 1938 NOTEQUAL REL CONST PUB UNTYP. CODE 522 NUM REL CONST PUB UNTYP. CODE 1010 NUMGREATER REL CONST PUB UNTYP. CODE 103C NUMS REL CONST PUB UNTYP. CODE 1026 NUMS1 REL CONST UNTYP. CODE 1028 ONEMINUS REL CONST PUB UNTYP. CODE 472 ONEMS REL CONST PUB UNTYP. CODE 1C92 ONEPLUS REL CONST PUB UNTYP. CODE 464 ORR REL CONST PUB UNTYP. CODE 420 OVER REL CONST PUB UNTYP. CODE 13C OWNONE REL CONST UNTYP. CODE 21A8 - 4e-core430G2553 - Page 176 OWRECV0 REL CONST UNTYP. CODE 21F2 OWRESET REL CONST PUB UNTYP. CODE 2168 OWSEND0 REL CONST UNTYP. CODE 21E0 OWSLOT REL CONST PUB UNTYP. CODE 21C0 P1 REL CONST PUB UNTYP. CODE 1DE2 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 1DEC 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 1DF6 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 A64 PADAREA ABS CONST EXT [002] UNTYP. __EXTERNS Solved Extern PAGEE REL CONST PUB UNTYP. CODE 1C2A PAREN REL CONST PUB UNTYP. CODE 15D4 PARENUDOTR REL CONST PUB UNTYP. CODE 19F6 PARENVECWIPE REL CONST PUB UNTYP. CODE 203C PARENWIPE REL CONST PUB UNTYP. CODE 1FD8 PARSE REL CONST PUB UNTYP. CODE 11F2 PARSE1 REL CONST UNTYP. CODE 120E PLUS REL CONST PUB UNTYP. CODE 3C8 PLUSLOOP REL CONST PUB UNTYP. CODE 1892 PLUSSTORE REL CONST PUB UNTYP. CODE 3D6 PN REL CONST PUB UNTYP. CODE 1BE0 POST1 REL CONST UNTYP. CODE 176C POST2 REL CONST UNTYP. CODE 176E POSTPONE REL CONST PUB UNTYP. CODE 1742 PROFUSE REL CONST UNTYP. CODE 0 PROFUSEADR REL CONST PUB UNTYP. CODE 1F9C PROMPT REL CONST PUB UNTYP. CODE 14E4 PROMPT1 REL CONST UNTYP. CODE 1516 PSTACK ABS CONST EXT [004] UNTYP. __EXTERNS Solved Extern PUSHTOS REL CONST UNTYP. CODE F2 QABO1 REL CONST UNTYP. CODE 156E QABORT REL CONST PUB UNTYP. CODE 1562 QDNEGATE REL CONST PUB UNTYP. CODE B8E QDUP REL CONST PUB UNTYP. CODE 104 QNEG1 REL CONST UNTYP. CODE B52 QNEGATE REL CONST PUB UNTYP. CODE B48 QNUM1 REL CONST UNTYP. CODE 1424 QNUM2 REL CONST UNTYP. CODE 1430 QNUM3 REL CONST UNTYP. CODE 1434 QNUMBER REL CONST PUB UNTYP. CODE 1400 QQ REL CONST PUB UNTYP. CODE 1DD4 QSIGN REL CONST PUB UNTYP. CODE 1388 QSIGN1 REL CONST UNTYP. CODE 13B2 QSTACK REL CONST PUB UNTYP. CODE 116E QTIB REL CONST PUB UNTYP. CODE E02 QTIB1 REL CONST UNTYP. CODE E14 QUIT REL CONST PUB UNTYP. CODE 1520 QUIT1 REL CONST UNTYP. CODE 1532 QUITIP REL CONST PUB UNTYP. CODE 1522 RAMDICT ABS CONST EXT [007] UNTYP. __EXTERNS Solved Extern RECURSE REL CONST PUB UNTYP. CODE 167E REPEAT REL CONST PUB UNTYP. CODE 1808 RESETADR REL CONST PUB UNTYP. CODE 1D5C REVEAL REL CONST PUB UNTYP. CODE 16D4 RFETCH REL CONST PUB UNTYP. CODE 1A2 - 4e-core430G2553 - Page 177 RFROM REL CONST PUB UNTYP. CODE 18E RIGHTBRACKET REL CONST PUB UNTYP. CODE 16A0 RLAA REL CONST PUB UNTYP. CODE 572 ROMDICT ABS CONST EXT [-001] UNTYP. __EXTERNS Solved Extern ROT REL CONST PUB UNTYP. CODE 154 RPFETCH REL CONST PUB UNTYP. CODE 1E0 RPSTORE REL CONST PUB UNTYP. CODE 1F6 RSHIFT REL CONST PUB UNTYP. CODE 4CE RSH_1 REL CONST UNTYP. CODE 4D8 RSH_X REL CONST UNTYP. CODE 4E0 RSTACK ABS CONST EXT [005] UNTYP. __EXTERNS Solved Extern RZERO REL CONST PUB UNTYP. CODE A78 S0 REL CONST PUB UNTYP. CODE A82 S2 REL CONST PUB UNTYP. CODE 2144 SAVE REL CONST PUB UNTYP. CODE 1EB2 SCAN REL CONST PUB UNTYP. CODE 768 SCAN_1 REL CONST UNTYP. CODE 772 SCAN_X REL CONST UNTYP. CODE 77C SEMICOLON REL CONST PUB UNTYP. CODE 1716 SEMIPN REL CONST PUB UNTYP. CODE 1BF4 SEQUAL REL CONST PUB UNTYP. CODE 78C SEQU_1 REL CONST UNTYP. CODE 796 SEQU_X REL CONST UNTYP. CODE 7AA SETIRX REL CONST PUB UNTYP. CODE 2282 SIGN REL CONST PUB UNTYP. CODE 1054 SIGN1 REL CONST UNTYP. CODE 1062 SKIP REL CONST PUB UNTYP. CODE 742 SKIP_1 REL CONST UNTYP. CODE 74C SKIP_X REL CONST UNTYP. CODE 756 SLASH REL CONST PUB UNTYP. CODE C54 SLASHMOD REL CONST PUB UNTYP. CODE C42 SLASHSTRING REL CONST PUB UNTYP. CODE 119C SMISMATCH REL CONST UNTYP. CODE 7A4 SMSLASHREM REL CONST PUB UNTYP. CODE BD2 SOURCE REL CONST PUB UNTYP. CODE 1188 SPACE REL CONST PUB UNTYP. CODE D82 SPACES REL CONST PUB UNTYP. CODE D94 SPCS1 REL CONST UNTYP. CODE D96 SPCS2 REL CONST UNTYP. CODE DA4 SPFETCH REL CONST PUB UNTYP. CODE 1B8 SPSTORE REL CONST PUB UNTYP. CODE 1CE SQEST REL CONST PUB UNTYP. CODE 2152 SQUOTE REL CONST PUB UNTYP. CODE F1A SSMOD REL CONST PUB UNTYP. CODE C76 STAR REL CONST PUB UNTYP. CODE C32 STARSLASH REL CONST PUB UNTYP. CODE C88 STATE REL CONST PUB UNTYP. CODE 9BA STOD REL CONST PUB UNTYP. CODE B34 STORCOLON REL CONST PUB UNTYP. CODE 91E STORE REL CONST PUB UNTYP. CODE 224 STORECF REL CONST PUB UNTYP. CODE 8D0 STOREDEST REL CONST PUB UNTYP. CODE 970 SWAP REL CONST PUB UNTYP. CODE 126 SWAPBYTES REL CONST PUB UNTYP. CODE 480 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 TABLE REL CONST PUB UNTYP. CODE 1C76 THEN REL CONST PUB UNTYP. CODE 178C TIB REL CONST PUB UNTYP. CODE A8E TIBAREA ABS CONST EXT [006] UNTYP. __EXTERNS Solved Extern TIBSIZE REL CONST PUB UNTYP. CODE A9E TIB_SIZE ABS CONST EXT [008] UNTYP. __EXTERNS Solved Extern - 4e-core430G2553 - Page 178 TICK REL CONST PUB UNTYP. CODE 158E TICKSOURCE REL CONST PUB UNTYP. CODE 9D4 TOBODY REL CONST PUB UNTYP. CODE 8B6 TOCOUNTED REL CONST PUB UNTYP. CODE 11B8 TODIGIT REL CONST PUB UNTYP. CODE FF0 TOIN REL CONST PUB UNTYP. CODE 9A0 TOL REL CONST PUB UNTYP. CODE 1816 TONUM1 REL CONST UNTYP. CODE 13C2 TONUM2 REL CONST UNTYP. CODE 13D8 TONUM3 REL CONST UNTYP. CODE 13F2 TONUMBER REL CONST PUB UNTYP. CODE 13C0 TOPSEG REL CONST PUB UNTYP. CODE 1DBC TOR REL CONST PUB UNTYP. CODE 17E TOSFALSE REL CONST UNTYP. CODE 516 TOSTRUE REL CONST UNTYP. CODE 538 TRUE REL CONST PUB UNTYP. CODE 1C5A TUCK REL CONST PUB UNTYP. CODE 208 TWOCONSTANT REL CONST PUB UNTYP. CODE 1B5C TWODROP REL CONST PUB UNTYP. CODE CF2 TWODUP REL CONST PUB UNTYP. CODE D02 TWOFETCH REL CONST PUB UNTYP. CODE CC6 TWOOVER REL CONST PUB UNTYP. CODE D2A TWOSLASH REL CONST PUB UNTYP. CODE 49C TWOSTAR REL CONST PUB UNTYP. CODE 48E TWOSTORE REL CONST PUB UNTYP. CODE CDA TWOSWAP REL CONST PUB UNTYP. CODE D14 TYP REL CONST PUB UNTYP. CODE E82 TYP3 REL CONST UNTYP. CODE E92 TYP4 REL CONST UNTYP. CODE EA0 TYP5 REL CONST UNTYP. CODE EA2 U0 REL CONST PUB UNTYP. CODE 994 UAREA ABS CONST EXT [001] UNTYP. __EXTERNS Solved Extern UAREA_SIZE ABS CONST EXT [-001] 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 106A UDOTR REL CONST PUB UNTYP. CODE 1A16 UDSLASHMOD REL CONST PUB UNTYP. CODE F88 UDSTAR REL CONST PUB UNTYP. CODE FA6 UGREATER REL CONST PUB UNTYP. CODE 562 UINIT REL CONST PUB UNTYP. CODE AB6 ULESS REL CONST PUB UNTYP. CODE 552 UMAX REL CONST PUB UNTYP. CODE DC8 UMAX1 REL CONST UNTYP. CODE DD4 UMIN REL CONST PUB UNTYP. CODE DB0 UMIN1 REL CONST UNTYP. CODE DBC UMSLASHMOD REL CONST PUB UNTYP. CODE 68E UMSTAR REL CONST PUB UNTYP. CODE 65E UNLOOP REL CONST PUB UNTYP. CODE 64C UNTIL REL CONST PUB UNTYP. CODE 17CA UNUSED REL CONST PUB UNTYP. CODE 1D98 UP ABS CONST EXT [000] UNTYP. __EXTERNS Solved Extern UPC REL CONST PUB UNTYP. CODE 12DA UPC1 REL CONST UNTYP. CODE 12F4 USER REL CONST PUB UNTYP. CODE B8 USEREMIT REL CONST PUB UNTYP. CODE A48 USERKEY REL CONST PUB UNTYP. CODE A38 VALIDQ REL CONST PUB UNTYP. CODE 1E9C VARAREA ABS CONST EXT [009] UNTYP. __EXTERNS Solved Extern - 4e-core430G2553 - Page 179 VARBOT REL CONST PUB UNTYP. CODE 1DAE VARIABLE REL CONST PUB UNTYP. CODE 7A VAR_SIZE ABS CONST EXT [010] UNTYP. __EXTERNS Solved Extern VECBACK REL CONST PUB UNTYP. CODE 20D0 VECBOT REL CONST PUB UNTYP. CODE 1DCA VECRESTORE REL CONST PUB UNTYP. CODE 20B4 VECSAVE REL CONST PUB UNTYP. CODE 2090 VECSTORE REL CONST PUB UNTYP. CODE 1FFA VECWIPE REL CONST PUB UNTYP. CODE 2076 WARM REL CONST PUB UNTYP. CODE 1F2A WDS1 REL CONST UNTYP. CODE 19C4 WDS2 REL CONST UNTYP. CODE 19D8 WDS3 REL CONST UNTYP. CODE 19F2 WDTCTL ABS CONST UNTYP. ASEG 120 WHILE REL CONST PUB UNTYP. CODE 17F6 WIPE REL CONST PUB UNTYP. CODE 1FC0 WITHIN REL CONST PUB UNTYP. CODE 18C6 WORDD REL CONST PUB UNTYP. CODE 1220 WORDS REL CONST PUB UNTYP. CODE 19BE XDOES REL CONST PUB UNTYP. CODE 164A XISQUOTE REL CONST PUB UNTYP. CODE EAE XORR REL CONST PUB UNTYP. CODE 430 XSQUOTE REL CONST PUB UNTYP. CODE EC6 ZERO REL CONST PUB UNTYP. CODE 836 ZEROEQUAL REL CONST PUB UNTYP. CODE 4EC ZEROLESS REL CONST PUB UNTYP. CODE 4FC ZEROS REL CONST PUB UNTYP. CODE 1A3C ZEROS1 REL CONST UNTYP. CODE 1A3E ZEROS2 REL CONST UNTYP. CODE 1A50 ZEROUDOTR REL CONST PUB UNTYP. CODE 1A28 __MSP430G2203__ ABS CONST UNTYP. ASEG Not solved abort1 REL CONST UNTYP. CODE 1552 boot1 REL CONST UNTYP. CODE 1F20 bran REL CONST PUB UNTYP. CODE 58E cclr REL CONST PUB UNTYP. CODE 1D0C ccrc1 REL CONST UNTYP. CODE 1B14 ccrc2 REL CONST UNTYP. CODE 1B1C cget REL CONST PUB UNTYP. CODE 1D3C cget1 REL CONST UNTYP. CODE 1D48 cget2 REL CONST UNTYP. CODE 1D4A cor ABS CONST EXT [011] UNTYP. __EXTERNS Solved Extern crcval ABS CONST EXT [018] UNTYP. __EXTERNS Solved Extern cset REL CONST PUB UNTYP. CODE 1CE0 ctoggle REL CONST PUB UNTYP. CODE 1D26 doboot0 REL CONST UNTYP. CODE 1E4F doboot1 REL CONST UNTYP. CODE 1E56 dobran REL CONST UNTYP. CODE 590 docreate REL CONST PUB UNTYP. CODE 98 dodoes REL CONST PUB UNTYP. CODE D4 donext REL CONST UNTYP. CODE 7EE donoop REL CONST UNTYP. CODE 7EE dotcold0 REL CONST UNTYP. CODE 1F3D dotcold1 REL CONST UNTYP. CODE 1F42 green REL CONST PUB UNTYP. CODE 2138 ih1 REL CONST UNTYP. CODE 1E68 infoB ABS CONST EXT [012] UNTYP. __EXTERNS Solved Extern infoC ABS CONST EXT [014] UNTYP. __EXTERNS Solved Extern infoD ABS CONST EXT [015] UNTYP. __EXTERNS Solved Extern intseg ABS CONST EXT [016] UNTYP. __EXTERNS Solved Extern intvecs ABS CONST EXT [017] UNTYP. __EXTERNS Solved Extern invalid REL CONST UNTYP. CODE 1F02 lastword REL CONST PUB UNTYP. CODE 227B link REL VAR UNTYP. CODE 227B lit REL CONST PUB UNTYP. CODE 48 lpm_wake REL CONST UNTYP. CODE 2244 ms1 REL CONST UNTYP. CODE 1CBA nullirq ABS CONST EXT [-001] UNTYP. __EXTERNS Solved Extern onems1 REL CONST UNTYP. CODE 1C9C onems2 REL CONST UNTYP. CODE 1CA4 pcrc1 REL CONST UNTYP. CODE 1B3C pcrc2 REL CONST UNTYP. CODE 1B4A pcrc3 REL CONST UNTYP. CODE 1B4C qbran REL CONST PUB UNTYP. CODE 5A2 red REL CONST PUB UNTYP. CODE 2128 reset ABS CONST EXT [020] UNTYP. __EXTERNS Solved Extern reset1 REL CONST UNTYP. CODE 1F10 resetvec REL CONST EXT [019] UNTYP. CODE Solved Extern setlpm0 REL CONST PUB UNTYP. CODE 226A - 4e-core430G2553 - Page 180 setlpm4 REL CONST PUB UNTYP. CODE 2254 stamp REL CONST UNTYP. CODE 16 stamp0 REL CONST UNTYP. CODE 17 stampend REL CONST UNTYP. CODE 2D uareasize ABS CONST UNTYP. CODE 22 uinitend REL CONST UNTYP. CODE ADA uinitstart REL CONST UNTYP. CODE AB8 valid REL CONST UNTYP. CODE 1F00 vback1 REL CONST UNTYP. CODE 20DA vback2 REL CONST UNTYP. CODE 20FC ver0 REL CONST UNTYP. CODE 3 verend REL CONST UNTYP. CODE 16 version REL CONST UNTYP. CODE 2 warm0 REL CONST UNTYP. CODE 1F2F warm1 REL CONST UNTYP. CODE 1F34 wclr REL CONST PUB UNTYP. CODE 1CF6 wipe1 REL CONST UNTYP. CODE 1FCC wipmsg0 REL CONST UNTYP. CODE 1FE7 wipmsg1 REL CONST UNTYP. CODE 1FEE wset REL CONST PUB UNTYP. CODE 1CCA xdo REL CONST PUB UNTYP. CODE 5B8 xloop REL CONST PUB UNTYP. CODE 5DE xplusloop REL CONST PUB UNTYP. CODE 5FE ############################## # CRC:6EB7 # # Errors: 0 # # Warnings: 0 # # Bytes: 8846 # ##############################