############################################################################### # # # IAR Assembler V5.30.1.50284/W32 for MSP430 28/Apr/2012 03:06:22 # # 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\Release0.34\List\4e-core430G2553.lst# # Object file = C:\Dokumente und Einstellungen\All Users\Dokumente\4e4th\Release0.34\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\Release0.34\Obj\ # # -s+ -M<> -w+ # # -LC:\Dokumente und Einstellungen\All Users\Dokumente\4e4th\Release0.34\List\ # # -i -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 10 000000 11 000000 #ifndef _SYSTEM_BUILD 12 000000 #pragma system_include 13 000000 #endif 14 000000 15 000000 #if defined (__MSP430C111__) 16 000000 #include "msp430c111.h" 18 000000 #elif defined (__MSP430C1111__) 19 000000 #include "msp430c1111.h" 21 000000 #elif defined (__MSP430C112__) 22 000000 #include "msp430c112.h" 24 000000 #elif defined (__MSP430C1121__) 25 000000 #include "msp430c1121.h" 27 000000 #elif defined (__MSP430C1331__) 28 000000 #include "msp430c1331.h" 30 000000 #elif defined (__MSP430C1351__) 31 000000 #include "msp430c1351.h" 33 000000 #elif defined (__MSP430C311S__) 34 000000 #include "msp430c311s.h" 36 000000 #elif defined (__MSP430C312__) 37 000000 #include "msp430c312.h" 39 000000 #elif defined (__MSP430C313__) 40 000000 #include "msp430c313.h" 42 000000 #elif defined (__MSP430C314__) 43 000000 #include "msp430c314.h" 45 000000 #elif defined (__MSP430C315__) 46 000000 #include "msp430c315.h" 48 000000 #elif defined (__MSP430C323__) 49 000000 #include "msp430c323.h" 51 000000 #elif defined (__MSP430C325__) 52 000000 #include "msp430c325.h" 54 000000 #elif defined (__MSP430C336__) 55 000000 #include "msp430c336.h" 57 000000 #elif defined (__MSP430C337__) 58 000000 #include "msp430c337.h" 60 000000 #elif defined (__MSP430C412__) 61 000000 #include "msp430c412.h" 63 000000 #elif defined (__MSP430C413__) 64 000000 #include "msp430c413.h" 66 000000 #elif defined (__MSP430CG4616__) 67 000000 #include "msp430cg4616.h" 69 000000 #elif defined (__MSP430CG4617__) 70 000000 #include "msp430cg4617.h" 72 000000 #elif defined (__MSP430CG4618__) 73 000000 #include "msp430cg4618.h" 75 000000 #elif defined (__MSP430CG4619__) 76 000000 #include "msp430cg4619.h" 78 000000 #elif defined (__MSP430E112__) 79 000000 #include "msp430e112.h" 81 000000 #elif defined (__MSP430E313__) 82 000000 #include "msp430e313.h" 84 000000 #elif defined (__MSP430E315__) 85 000000 #include "msp430e315.h" 87 000000 #elif defined (__MSP430E325__) 88 000000 #include "msp430e325.h" 90 000000 #elif defined (__MSP430E337__) 91 000000 #include "msp430e337.h" 93 000000 #elif defined (__MSP430F110__) 94 000000 #include "msp430f110.h" 96 000000 #elif defined (__MSP430F1101__) 97 000000 #include "msp430f1101.h" 99 000000 #elif defined (__MSP430F1101A__) 100 000000 #include "msp430f1101a.h" 102 000000 #elif defined (__MSP430F1111__) 103 000000 #include "msp430f1111.h" 105 000000 #elif defined (__MSP430F1111A__) 106 000000 #include "msp430f1111a.h" 108 000000 #elif defined (__MSP430F112__) 109 000000 #include "msp430f112.h" 111 000000 #elif defined (__MSP430F1121__) 112 000000 #include "msp430f1121.h" 114 000000 #elif defined (__MSP430F1121A__) 115 000000 #include "msp430f1121a.h" 117 000000 #elif defined (__MSP430F1122__) 118 000000 #include "msp430f1122.h" 120 000000 #elif defined (__MSP430F1132__) 121 000000 #include "msp430f1132.h" 123 000000 #elif defined (__MSP430F122__) 124 000000 #include "msp430f122.h" 126 000000 #elif defined (__MSP430F1222__) 127 000000 #include "msp430f1222.h" 129 000000 #elif defined (__MSP430F123__) 130 000000 #include "msp430f123.h" 132 000000 #elif defined (__MSP430F1232__) 133 000000 #include "msp430f1232.h" 135 000000 #elif defined (__MSP430F133__) 136 000000 #include "msp430f133.h" 138 000000 #elif defined (__MSP430F135__) 139 000000 #include "msp430f135.h" 141 000000 #elif defined (__MSP430F147__) 142 000000 #include "msp430f147.h" 144 000000 #elif defined (__MSP430F148__) 145 000000 #include "msp430f148.h" 147 000000 #elif defined (__MSP430F149__) 148 000000 #include "msp430f149.h" 150 000000 #elif defined (__MSP430F1471__) 151 000000 #include "msp430f1471.h" 153 000000 #elif defined (__MSP430F1481__) 154 000000 #include "msp430f1481.h" 156 000000 #elif defined (__MSP430F1491__) 157 000000 #include "msp430f1491.h" 159 000000 #elif defined (__MSP430F155__) 160 000000 #include "msp430f155.h" 162 000000 #elif defined (__MSP430F156__) 163 000000 #include "msp430f156.h" 165 000000 #elif defined (__MSP430F157__) 166 000000 #include "msp430f157.h" 168 000000 #elif defined (__MSP430F167__) 169 000000 #include "msp430f167.h" 171 000000 #elif defined (__MSP430F168__) 172 000000 #include "msp430f168.h" 174 000000 #elif defined (__MSP430F169__) 175 000000 #include "msp430f169.h" 177 000000 #elif defined (__MSP430F1610__) 178 000000 #include "msp430f1610.h" 180 000000 #elif defined (__MSP430F1611__) 181 000000 #include "msp430f1611.h" 183 000000 #elif defined (__MSP430F1612__) 184 000000 #include "msp430f1612.h" 186 000000 #elif defined (__MSP430F2001__) 187 000000 #include "msp430f2001.h" 189 000000 #elif defined (__MSP430F2011__) 190 000000 #include "msp430f2011.h" 192 000000 #elif defined (__MSP430F2002__) 193 000000 #include "msp430f2002.h" 195 000000 #elif defined (__MSP430F2012__) 196 000000 #include "msp430f2012.h" 198 000000 #elif defined (__MSP430F2003__) 199 000000 #include "msp430f2003.h" 201 000000 #elif defined (__MSP430F2013__) 202 000000 #include "msp430f2013.h" 204 000000 #elif defined (__MSP430F2101__) 205 000000 #include "msp430f2101.h" 207 000000 #elif defined (__MSP430F2111__) 208 000000 #include "msp430f2111.h" 210 000000 #elif defined (__MSP430F2121__) 211 000000 #include "msp430f2121.h" 213 000000 #elif defined (__MSP430F2131__) 214 000000 #include "msp430f2131.h" 216 000000 #elif defined (__MSP430F2112__) 217 000000 #include "msp430f2112.h" 219 000000 #elif defined (__MSP430F2122__) 220 000000 #include "msp430f2122.h" 222 000000 #elif defined (__MSP430F2132__) 223 000000 #include "msp430f2132.h" 225 000000 #elif defined (__MSP430F2232__) 226 000000 #include "msp430f2232.h" 228 000000 #elif defined (__MSP430F2252__) 229 000000 #include "msp430f2252.h" 231 000000 #elif defined (__MSP430F2272__) 232 000000 #include "msp430f2272.h" 234 000000 #elif defined (__MSP430F2234__) 235 000000 #include "msp430f2234.h" 237 000000 #elif defined (__MSP430F2254__) 238 000000 #include "msp430f2254.h" 240 000000 #elif defined (__MSP430F2274__) 241 000000 #include "msp430f2274.h" 243 000000 #elif defined (__MSP430F2330__) 244 000000 #include "msp430f2330.h" 246 000000 #elif defined (__MSP430F2350__) 247 000000 #include "msp430f2350.h" 249 000000 #elif defined (__MSP430F2370__) 250 000000 #include "msp430f2370.h" 252 000000 #elif defined (__MSP430F233__) 253 000000 #include "msp430f233.h" 255 000000 #elif defined (__MSP430F235__) 256 000000 #include "msp430f235.h" 258 000000 #elif defined (__MSP430F247__) 259 000000 #include "msp430f247.h" 261 000000 #elif defined (__MSP430F248__) 262 000000 #include "msp430f248.h" 264 000000 #elif defined (__MSP430F249__) 265 000000 #include "msp430f249.h" 267 000000 #elif defined (__MSP430F2410__) 268 000000 #include "msp430f2410.h" 270 000000 #elif defined (__MSP430F2471__) 271 000000 #include "msp430f2471.h" 273 000000 #elif defined (__MSP430F2481__) 274 000000 #include "msp430f2481.h" 276 000000 #elif defined (__MSP430F2491__) 277 000000 #include "msp430f2491.h" 279 000000 #elif defined (__MSP430F2416__) 280 000000 #include "msp430f2416.h" 282 000000 #elif defined (__MSP430F2417__) 283 000000 #include "msp430f2417.h" 285 000000 #elif defined (__MSP430F2418__) 286 000000 #include "msp430f2418.h" 288 000000 #elif defined (__MSP430F2419__) 289 000000 #include "msp430f2419.h" 291 000000 #elif defined (__MSP430F2616__) 292 000000 #include "msp430f2616.h" 294 000000 #elif defined (__MSP430F2617__) 295 000000 #include "msp430f2617.h" 297 000000 #elif defined (__MSP430F2618__) 298 000000 #include "msp430f2618.h" 300 000000 #elif defined (__MSP430F2619__) 301 000000 #include "msp430f2619.h" 303 000000 #elif defined (__MSP430F412__) 304 000000 #include "msp430f412.h" 306 000000 #elif defined (__MSP430F413__) 307 000000 #include "msp430f413.h" 309 000000 #elif defined (__MSP430F415__) 310 000000 #include "msp430f415.h" 312 000000 #elif defined (__MSP430F417__) 313 000000 #include "msp430f417.h" 315 000000 #elif defined (__MSP430F4132__) 316 000000 #include "msp430f4132.h" 318 000000 #elif defined (__MSP430F4152__) 319 000000 #include "msp430f4152.h" 321 000000 #elif defined (__MSP430F423__) 322 000000 #include "msp430f423.h" 324 000000 #elif defined (__MSP430F425__) 325 000000 #include "msp430f425.h" 327 000000 #elif defined (__MSP430F427__) 328 000000 #include "msp430f427.h" 330 000000 #elif defined (__MSP430F423A__) 331 000000 #include "msp430f423a.h" 333 000000 #elif defined (__MSP430F425A__) 334 000000 #include "msp430f425a.h" 336 000000 #elif defined (__MSP430F427A__) 337 000000 #include "msp430f427a.h" 339 000000 #elif defined (__MSP430F435__) 340 000000 #include "msp430f435.h" 342 000000 #elif defined (__MSP430F436__) 343 000000 #include "msp430f436.h" 345 000000 #elif defined (__MSP430F437__) 346 000000 #include "msp430f437.h" 348 000000 #elif defined (__MSP430F4351__) 349 000000 #include "msp430f4351.h" 351 000000 #elif defined (__MSP430F4361__) 352 000000 #include "msp430f4361.h" 354 000000 #elif defined (__MSP430F4371__) 355 000000 #include "msp430f4371.h" 357 000000 #elif defined (__MSP430F4481__) 358 000000 #include "msp430f4481.h" 360 000000 #elif defined (__MSP430F4491__) 361 000000 #include "msp430f4491.h" 363 000000 #elif defined (__MSP430F447__) 364 000000 #include "msp430f447.h" 366 000000 #elif defined (__MSP430F448__) 367 000000 #include "msp430f448.h" 369 000000 #elif defined (__MSP430F449__) 370 000000 #include "msp430f449.h" 372 000000 #elif defined (__MSP430FE423__) 373 000000 #include "msp430fe423.h" 375 000000 #elif defined (__MSP430FE425__) 376 000000 #include "msp430fe425.h" 378 000000 #elif defined (__MSP430FE427__) 379 000000 #include "msp430fe427.h" 381 000000 #elif defined (__MSP430FE423A__) 382 000000 #include "msp430fe423a.h" 384 000000 #elif defined (__MSP430FE425A__) 385 000000 #include "msp430fe425a.h" 387 000000 #elif defined (__MSP430FE427A__) 388 000000 #include "msp430fe427a.h" 390 000000 #elif defined (__MSP430FE4232__) 391 000000 #include "msp430fe4232.h" 393 000000 #elif defined (__MSP430FE4242__) 394 000000 #include "msp430fe4242.h" 396 000000 #elif defined (__MSP430FE4252__) 397 000000 #include "msp430fe4252.h" 399 000000 #elif defined (__MSP430FE4272__) 400 000000 #include "msp430fe4272.h" 402 000000 #elif defined (__MSP430F4783__) 403 000000 #include "msp430f4783.h" 405 000000 #elif defined (__MSP430F4793__) 406 000000 #include "msp430f4793.h" 408 000000 #elif defined (__MSP430F4784__) 409 000000 #include "msp430f4784.h" 411 000000 #elif defined (__MSP430F4794__) 412 000000 #include "msp430f4794.h" 414 000000 #elif defined (__MSP430F47126__) 415 000000 #include "msp430f47126.h" 417 000000 #elif defined (__MSP430F47127__) 418 000000 #include "msp430f47127.h" 420 000000 #elif defined (__MSP430F47163__) 421 000000 #include "msp430f47163.h" 423 000000 #elif defined (__MSP430F47173__) 424 000000 #include "msp430f47173.h" 426 000000 #elif defined (__MSP430F47183__) 427 000000 #include "msp430f47183.h" 429 000000 #elif defined (__MSP430F47193__) 430 000000 #include "msp430f47193.h" 432 000000 #elif defined (__MSP430F47166__) 433 000000 #include "msp430f47166.h" 435 000000 #elif defined (__MSP430F47176__) 436 000000 #include "msp430f47176.h" 438 000000 #elif defined (__MSP430F47186__) 439 000000 #include "msp430f47186.h" 441 000000 #elif defined (__MSP430F47196__) 442 000000 #include "msp430f47196.h" 444 000000 #elif defined (__MSP430F47167__) 445 000000 #include "msp430f47167.h" 447 000000 #elif defined (__MSP430F47177__) 448 000000 #include "msp430f47177.h" 450 000000 #elif defined (__MSP430F47187__) 451 000000 #include "msp430f47187.h" 453 000000 #elif defined (__MSP430F47197__) 454 000000 #include "msp430f47197.h" 456 000000 #elif defined (__MSP430F4250__) 457 000000 #include "msp430f4250.h" 459 000000 #elif defined (__MSP430F4260__) 460 000000 #include "msp430f4260.h" 462 000000 #elif defined (__MSP430F4270__) 463 000000 #include "msp430f4270.h" 465 000000 #elif defined (__MSP430FG4250__) 466 000000 #include "msp430fg4250.h" 468 000000 #elif defined (__MSP430FG4260__) 469 000000 #include "msp430fg4260.h" 471 000000 #elif defined (__MSP430FG4270__) 472 000000 #include "msp430fg4270.h" 474 000000 #elif defined (__MSP430FW423__) 475 000000 #include "msp430fw423.h" 477 000000 #elif defined (__MSP430FW425__) 478 000000 #include "msp430fw425.h" 480 000000 #elif defined (__MSP430FW427__) 481 000000 #include "msp430fw427.h" 483 000000 #elif defined (__MSP430FW428__) 484 000000 #include "msp430fw428.h" 486 000000 #elif defined (__MSP430FW429__) 487 000000 #include "msp430fw429.h" 489 000000 #elif defined (__MSP430FG437__) 490 000000 #include "msp430fg437.h" 492 000000 #elif defined (__MSP430FG438__) 493 000000 #include "msp430fg438.h" 495 000000 #elif defined (__MSP430FG439__) 496 000000 #include "msp430fg439.h" 498 000000 #elif defined (__MSP430F438__) 499 000000 #include "msp430f438.h" 501 000000 #elif defined (__MSP430F439__) 502 000000 #include "msp430f439.h" 504 000000 #elif defined (__MSP430F477__) 505 000000 #include "msp430f477.h" 507 000000 #elif defined (__MSP430F478__) 508 000000 #include "msp430f478.h" 510 000000 #elif defined (__MSP430F479__) 511 000000 #include "msp430f479.h" 513 000000 #elif defined (__MSP430FG477__) 514 000000 #include "msp430fg477.h" 516 000000 #elif defined (__MSP430FG478__) 517 000000 #include "msp430fg478.h" 519 000000 #elif defined (__MSP430FG479__) 520 000000 #include "msp430fg479.h" 522 000000 #elif defined (__MSP430F46161__) 523 000000 #include "msp430f46161.h" 525 000000 #elif defined (__MSP430F46171__) 526 000000 #include "msp430f46171.h" 528 000000 #elif defined (__MSP430F46181__) 529 000000 #include "msp430f46181.h" 531 000000 #elif defined (__MSP430F46191__) 532 000000 #include "msp430f46191.h" 534 000000 #elif defined (__MSP430F4616__) 535 000000 #include "msp430f4616.h" 537 000000 #elif defined (__MSP430F4617__) 538 000000 #include "msp430f4617.h" 540 000000 #elif defined (__MSP430F4618__) 541 000000 #include "msp430f4618.h" 543 000000 #elif defined (__MSP430F4619__) 544 000000 #include "msp430f4619.h" 546 000000 #elif defined (__MSP430FG4616__) 547 000000 #include "msp430fg4616.h" 549 000000 #elif defined (__MSP430FG4617__) 550 000000 #include "msp430fg4617.h" 552 000000 #elif defined (__MSP430FG4618__) 553 000000 #include "msp430fg4618.h" 555 000000 #elif defined (__MSP430FG4619__) 556 000000 #include "msp430fg4619.h" 558 000000 #elif defined (__MSP430F5418__) 559 000000 #include "msp430f5418.h" 561 000000 #elif defined (__MSP430F5419__) 562 000000 #include "msp430f5419.h" 564 000000 #elif defined (__MSP430F5435__) 565 000000 #include "msp430f5435.h" 567 000000 #elif defined (__MSP430F5436__) 568 000000 #include "msp430f5436.h" 570 000000 #elif defined (__MSP430F5437__) 571 000000 #include "msp430f5437.h" 573 000000 #elif defined (__MSP430F5438__) 574 000000 #include "msp430f5438.h" 576 000000 #elif defined (__XMS430F5438__) 577 000000 #include "xms430f5438.h" 579 000000 #elif defined (__MSP430F5418A__) 580 000000 #include "msp430f5418a.h" 582 000000 #elif defined (__MSP430F5419A__) 583 000000 #include "msp430f5419a.h" 585 000000 #elif defined (__MSP430F5435A__) 586 000000 #include "msp430f5435a.h" 588 000000 #elif defined (__MSP430F5436A__) 589 000000 #include "msp430f5436a.h" 591 000000 #elif defined (__MSP430F5437A__) 592 000000 #include "msp430f5437a.h" 594 000000 #elif defined (__MSP430F5438A__) 595 000000 #include "msp430f5438a.h" 597 000000 #elif defined (__MSP430F5304__) 598 000000 #include "msp430f5304.h" 600 000000 #elif defined (__MSP430F5308__) 601 000000 #include "msp430f5308.h" 603 000000 #elif defined (__MSP430F5309__) 604 000000 #include "msp430f5309.h" 606 000000 #elif defined (__MSP430F5310__) 607 000000 #include "msp430f5310.h" 609 000000 #elif defined (__MSP430F5340__) 610 000000 #include "msp430f5340.h" 612 000000 #elif defined (__MSP430F5341__) 613 000000 #include "msp430f5341.h" 615 000000 #elif defined (__MSP430F5342__) 616 000000 #include "msp430f5342.h" 618 000000 #elif defined (__MSP430F5324__) 619 000000 #include "msp430f5324.h" 621 000000 #elif defined (__MSP430F5325__) 622 000000 #include "msp430f5325.h" 624 000000 #elif defined (__MSP430F5326__) 625 000000 #include "msp430f5326.h" 627 000000 #elif defined (__MSP430F5327__) 628 000000 #include "msp430f5327.h" 630 000000 #elif defined (__MSP430F5328__) 631 000000 #include "msp430f5328.h" 633 000000 #elif defined (__MSP430F5329__) 634 000000 #include "msp430f5329.h" 636 000000 #elif defined (__MSP430F5500__) 637 000000 #include "msp430f5500.h" 639 000000 #elif defined (__MSP430F5501__) 640 000000 #include "msp430f5501.h" 642 000000 #elif defined (__MSP430F5502__) 643 000000 #include "msp430f5502.h" 645 000000 #elif defined (__MSP430F5503__) 646 000000 #include "msp430f5503.h" 648 000000 #elif defined (__MSP430F5504__) 649 000000 #include "msp430f5504.h" 651 000000 #elif defined (__MSP430F5505__) 652 000000 #include "msp430f5505.h" 654 000000 #elif defined (__MSP430F5506__) 655 000000 #include "msp430f5506.h" 657 000000 #elif defined (__MSP430F5507__) 658 000000 #include "msp430f5507.h" 660 000000 #elif defined (__MSP430F5508__) 661 000000 #include "msp430f5508.h" 663 000000 #elif defined (__MSP430F5509__) 664 000000 #include "msp430f5509.h" 666 000000 #elif defined (__MSP430F5510__) 667 000000 #include "msp430f5510.h" 669 000000 #elif defined (__MSP430F5513__) 670 000000 #include "msp430f5513.h" 672 000000 #elif defined (__MSP430F5514__) 673 000000 #include "msp430f5514.h" 675 000000 #elif defined (__MSP430F5515__) 676 000000 #include "msp430f5515.h" 678 000000 #elif defined (__MSP430F5517__) 679 000000 #include "msp430f5517.h" 681 000000 #elif defined (__MSP430F5519__) 682 000000 #include "msp430f5519.h" 684 000000 #elif defined (__MSP430F5521__) 685 000000 #include "msp430f5521.h" 687 000000 #elif defined (__MSP430F5522__) 688 000000 #include "msp430f5522.h" 690 000000 #elif defined (__MSP430F5524__) 691 000000 #include "msp430f5524.h" 693 000000 #elif defined (__MSP430F5525__) 694 000000 #include "msp430f5525.h" 696 000000 #elif defined (__MSP430F5526__) 697 000000 #include "msp430f5526.h" 699 000000 #elif defined (__MSP430F5527__) 700 000000 #include "msp430f5527.h" 702 000000 #elif defined (__MSP430F5528__) 703 000000 #include "msp430f5528.h" 705 000000 #elif defined (__MSP430F5529__) 706 000000 #include "msp430f5529.h" 708 000000 #elif defined (__MSP430P112__) 709 000000 #include "msp430p112.h" 711 000000 #elif defined (__MSP430P313__) 712 000000 #include "msp430p313.h" 714 000000 #elif defined (__MSP430P315__) 715 000000 #include "msp430p315.h" 717 000000 #elif defined (__MSP430P315S__) 718 000000 #include "msp430p315s.h" 720 000000 #elif defined (__MSP430P325__) 721 000000 #include "msp430p325.h" 723 000000 #elif defined (__MSP430P337__) 724 000000 #include "msp430p337.h" 726 000000 #elif defined (__CC430F5133__) 727 000000 #include "cc430f5133.h" 729 000000 #elif defined (__CC430F5135__) 730 000000 #include "cc430f5135.h" 732 000000 #elif defined (__CC430F5137__) 733 000000 #include "cc430f5137.h" 735 000000 #elif defined (__CC430F6125__) 736 000000 #include "cc430f6125.h" 738 000000 #elif defined (__CC430F6126__) 739 000000 #include "cc430f6126.h" 741 000000 #elif defined (__CC430F6127__) 742 000000 #include "cc430f6127.h" 744 000000 #elif defined (__CC430F6135__) 745 000000 #include "cc430f6135.h" 747 000000 #elif defined (__CC430F6137__) 748 000000 #include "cc430f6137.h" 750 000000 #elif defined (__MSP430F5630__) 751 000000 #include "msp430f5630.h" 753 000000 #elif defined (__MSP430F5631__) 754 000000 #include "msp430f5631.h" 756 000000 #elif defined (__MSP430F5632__) 757 000000 #include "msp430f5632.h" 759 000000 #elif defined (__MSP430F5633__) 760 000000 #include "msp430f5633.h" 762 000000 #elif defined (__MSP430F5634__) 763 000000 #include "msp430f5634.h" 765 000000 #elif defined (__MSP430F5635__) 766 000000 #include "msp430f5635.h" 768 000000 #elif defined (__MSP430F5636__) 769 000000 #include "msp430f5636.h" 771 000000 #elif defined (__MSP430F5637__) 772 000000 #include "msp430f5637.h" 774 000000 #elif defined (__MSP430F5638__) 775 000000 #include "msp430f5638.h" 777 000000 #elif defined (__MSP430F6630__) 778 000000 #include "msp430f6630.h" 780 000000 #elif defined (__MSP430F6631__) 781 000000 #include "msp430f6631.h" 783 000000 #elif defined (__MSP430F6632__) 784 000000 #include "msp430f6632.h" 786 000000 #elif defined (__MSP430F6633__) 787 000000 #include "msp430f6633.h" 789 000000 #elif defined (__MSP430F6634__) 790 000000 #include "msp430f6634.h" 792 000000 #elif defined (__MSP430F6635__) 793 000000 #include "msp430f6635.h" 795 000000 #elif defined (__MSP430F6636__) 796 000000 #include "msp430f6636.h" 798 000000 #elif defined (__MSP430F6637__) 799 000000 #include "msp430f6637.h" 801 000000 #elif defined (__MSP430F6638__) 802 000000 #include "msp430f6638.h" 804 000000 #elif defined (__MSP430L092__) 805 000000 #include "msp430l092.h" 807 000000 #elif defined (__MSP430C091__) 808 000000 #include "msp430c091.h" 810 000000 #elif defined (__MSP430C092__) 811 000000 #include "msp430c092.h" 813 000000 #elif defined (__MSP430F5131__) 814 000000 #include "msp430f5131.h" 816 000000 #elif defined (__MSP430F5151__) 817 000000 #include "msp430f5151.h" 819 000000 #elif defined (__MSP430F5171__) 820 000000 #include "msp430f5171.h" 822 000000 #elif defined (__MSP430F5132__) 823 000000 #include "msp430f5132.h" 825 000000 #elif defined (__MSP430F5152__) 826 000000 #include "msp430f5152.h" 828 000000 #elif defined (__MSP430F5172__) 829 000000 #include "msp430f5172.h" 831 000000 #elif defined (__MSP430FR5720__) 832 000000 #include "msp430fr5720.h" 834 000000 #elif defined (__MSP430FR5725__) 835 000000 #include "msp430fr5725.h" 837 000000 #elif defined (__MSP430FR5728__) 838 000000 #include "msp430fr5728.h" 840 000000 #elif defined (__MSP430FR5729__) 841 000000 #include "msp430fr5729.h" 843 000000 #elif defined (__MSP430FR5730__) 844 000000 #include "msp430fr5730.h" 846 000000 #elif defined (__MSP430FR5735__) 847 000000 #include "msp430fr5735.h" 849 000000 #elif defined (__MSP430FR5738__) 850 000000 #include "msp430fr5738.h" 852 000000 #elif defined (__MSP430FR5739__) 853 000000 #include "msp430fr5739.h" 855 000000 #elif defined (__MSP430G2211__) 856 000000 #include "msp430g2211.h" 858 000000 #elif defined (__MSP430G2201__) 859 000000 #include "msp430g2201.h" 861 000000 #elif defined (__MSP430G2111__) 862 000000 #include "msp430g2111.h" 864 000000 #elif defined (__MSP430G2101__) 865 000000 #include "msp430g2101.h" 867 000000 #elif defined (__MSP430G2001__) 868 000000 #include "msp430g2001.h" 870 000000 #elif defined (__MSP430G2231__) 871 000000 #include "msp430g2231.h" 873 000000 #elif defined (__MSP430G2221__) 874 000000 #include "msp430g2221.h" 876 000000 #elif defined (__MSP430G2131__) 877 000000 #include "msp430g2131.h" 879 000000 #elif defined (__MSP430G2121__) 880 000000 #include "msp430g2121.h" 882 000000 #elif defined (__MSP430AFE221__) 883 000000 #include "msp430afe221.h" 885 000000 #elif defined (__MSP430AFE231__) 886 000000 #include "msp430afe231.h" 888 000000 #elif defined (__MSP430AFE251__) 889 000000 #include "msp430afe251.h" 891 000000 #elif defined (__MSP430AFE222__) 892 000000 #include "msp430afe222.h" 894 000000 #elif defined (__MSP430AFE232__) 895 000000 #include "msp430afe232.h" 897 000000 #elif defined (__MSP430AFE252__) 898 000000 #include "msp430afe252.h" 900 000000 #elif defined (__MSP430AFE223__) 901 000000 #include "msp430afe223.h" 903 000000 #elif defined (__MSP430AFE233__) 904 000000 #include "msp430afe233.h" 906 000000 #elif defined (__MSP430AFE253__) 907 000000 #include "msp430afe253.h" 909 000000 #elif defined (__MSP430G2102__) 910 000000 #include "msp430g2102.h" 912 000000 #elif defined (__MSP430G2202__) 913 000000 #include "msp430g2202.h" 915 000000 #elif defined (__MSP430G2302__) 916 000000 #include "msp430g2302.h" 918 000000 #elif defined (__MSP430G2402__) 919 000000 #include "msp430g2402.h" 921 000000 #elif defined (__MSP430G2132__) 922 000000 #include "msp430g2132.h" 924 000000 #elif defined (__MSP430G2232__) 925 000000 #include "msp430g2232.h" 927 000000 #elif defined (__MSP430G2332__) 928 000000 #include "msp430g2332.h" 930 000000 #elif defined (__MSP430G2432__) 931 000000 #include "msp430g2432.h" 933 000000 #elif defined (__MSP430G2112__) 934 000000 #include "msp430g2112.h" 936 000000 #elif defined (__MSP430G2212__) 937 000000 #include "msp430g2212.h" 939 000000 #elif defined (__MSP430G2312__) 940 000000 #include "msp430g2312.h" 942 000000 #elif defined (__MSP430G2412__) 943 000000 #include "msp430g2412.h" 945 000000 #elif defined (__MSP430G2152__) 946 000000 #include "msp430g2152.h" 948 000000 #elif defined (__MSP430G2252__) 949 000000 #include "msp430g2252.h" 951 000000 #elif defined (__MSP430G2352__) 952 000000 #include "msp430g2352.h" 954 000000 #elif defined (__MSP430G2452__) 955 000000 #include "msp430g2452.h" 957 000000 #elif defined (__MSP430G2113__) 958 000000 #include "msp430g2113.h" 960 000000 #elif defined (__MSP430G2213__) 961 000000 #include "msp430g2213.h" 963 000000 #elif defined (__MSP430G2313__) 964 000000 #include "msp430g2313.h" 966 000000 #elif defined (__MSP430G2413__) 967 000000 #include "msp430g2413.h" 969 000000 #elif defined (__MSP430G2513__) 970 000000 #include "msp430g2513.h" 972 000000 #elif defined (__MSP430G2153__) 973 000000 #include "msp430g2153.h" 975 000000 #elif defined (__MSP430G2253__) 976 000000 #include "msp430g2253.h" 978 000000 #elif defined (__MSP430G2353__) 979 000000 #include "msp430g2353.h" 981 000000 #elif defined (__MSP430G2453__) 982 000000 #include "msp430g2453.h" 984 000000 #elif defined (__MSP430G2553__) 985 000000 #include "msp430g2553.h" 1 000000 /*********************************************** ********************* 2 000000 * 3 000000 * Standard register and bit definitions for the Texas Instruments 4 000000 * MSP430 microcontroller. 5 000000 * 6 000000 * This file supports assembler and C development for 7 000000 * MSP430G2553 devices. 8 000000 * 9 000000 * Texas Instruments, Version 1.0 10 000000 * 11 000000 * Rev. 1.0, Setup 12 000000 * 13 000000 ************************************************ ********************/ 14 000000 15 000000 #ifndef __MSP430G2553 16 000000 #define __MSP430G2553 17 000000 18 000000 #ifdef __IAR_SYSTEMS_ICC__ 19 000000 #ifndef _SYSTEM_BUILD 20 000000 #pragma system_include 21 000000 #endif 22 000000 #endif 23 000000 24 000000 #if (((__TID__ >> 8) & 0x7F) != 0x2b) /* 0x2b = 43 dec */ 25 000000 #error msp430g2553.h file for use with ICC430/A430 only 26 000000 #endif 27 000000 28 000000 29 000000 #ifdef __IAR_SYSTEMS_ICC__ 30 000000 #include "in430.h" 31 000000 #pragma language=extended 33 000000 #define DEFC(name, address) __no_init volatile unsigned char name @ address; 34 000000 #define DEFW(name, address) __no_init volatile unsigned short name @ address; 35 000000 #define DEFXC volatile unsigned char 36 000000 #define DEFXW volatile unsigned short 38 000000 #endif /* __IAR_SYSTEMS_ICC__ */ 39 000000 40 000000 41 000000 #ifdef __IAR_SYSTEMS_ASM__ 42 000000 #define DEFC(name, address) sfrb name = address; 43 000000 #define DEFW(name, address) sfrw name = address; 44 000000 45 000000 #endif /* __IAR_SYSTEMS_ASM__*/ 46 000000 47 000000 #ifdef __cplusplus 48 000000 #define READ_ONLY 49 000000 #else 50 000000 #define READ_ONLY const 51 000000 #endif 52 000000 53 000000 /*********************************************** ************* 54 000000 * STANDARD BITS 55 000000 ************************************************ ************/ 56 000000 57 000000 #define BIT0 (0x0001u) 58 000000 #define BIT1 (0x0002u) 59 000000 #define BIT2 (0x0004u) 60 000000 #define BIT3 (0x0008u) 61 000000 #define BIT4 (0x0010u) 62 000000 #define BIT5 (0x0020u) 63 000000 #define BIT6 (0x0040u) 64 000000 #define BIT7 (0x0080u) 65 000000 #define BIT8 (0x0100u) 66 000000 #define BIT9 (0x0200u) 67 000000 #define BITA (0x0400u) 68 000000 #define BITB (0x0800u) 69 000000 #define BITC (0x1000u) 70 000000 #define BITD (0x2000u) 71 000000 #define BITE (0x4000u) 72 000000 #define BITF (0x8000u) 73 000000 74 000000 /*********************************************** ************* 75 000000 * STATUS REGISTER BITS 76 000000 ************************************************ ************/ 77 000000 78 000000 #define C (0x0001u) 79 000000 #define Z (0x0002u) 80 000000 #define N (0x0004u) 81 000000 #define V (0x0100u) 82 000000 #define GIE (0x0008u) 83 000000 #define CPUOFF (0x0010u) 84 000000 #define OSCOFF (0x0020u) 85 000000 #define SCG0 (0x0040u) 86 000000 #define SCG1 (0x0080u) 87 000000 88 000000 /* Low Power Modes coded with Bits 4-7 in SR */ 89 000000 90 000000 #ifndef __IAR_SYSTEMS_ICC__ /* Begin #defines for assembler */ 91 000000 #define LPM0 (CPUOFF) 92 000000 #define LPM1 (SCG0+CPUOFF) 93 000000 #define LPM2 (SCG1+CPUOFF) 94 000000 #define LPM3 (SCG1+SCG0+CPUOFF) 95 000000 #define LPM4 (SCG1+SCG0+OSCOFF+CP UOFF) 96 000000 /* End #defines for assembler */ 97 000000 98 000000 #else /* Begin #defines for C */ 99 000000 #define LPM0_bits (CPUOFF) 100 000000 #define LPM1_bits (SCG0+CPUOFF) 101 000000 #define LPM2_bits (SCG1+CPUOFF) 102 000000 #define LPM3_bits (SCG1+SCG0+CPUOFF) 103 000000 #define LPM4_bits (SCG1+SCG0+OSCOFF+CP UOFF) 105 000000 #include "in430.h" 107 000000 #define LPM0 _BIS_SR(LPM0_bits) /* Enter Low Power Mode 0 */ 108 000000 #define LPM0_EXIT _BIC_SR_IRQ(LPM0_bits) /* Exit Low Power Mode 0 */ 109 000000 #define LPM1 _BIS_SR(LPM1_bits) /* Enter Low Power Mode 1 */ 110 000000 #define LPM1_EXIT _BIC_SR_IRQ(LPM1_bits) /* Exit Low Power Mode 1 */ 111 000000 #define LPM2 _BIS_SR(LPM2_bits) /* Enter Low Power Mode 2 */ 112 000000 #define LPM2_EXIT _BIC_SR_IRQ(LPM2_bits) /* Exit Low Power Mode 2 */ 113 000000 #define LPM3 _BIS_SR(LPM3_bits) /* Enter Low Power Mode 3 */ 114 000000 #define LPM3_EXIT _BIC_SR_IRQ(LPM3_bits) /* Exit Low Power Mode 3 */ 115 000000 #define LPM4 _BIS_SR(LPM4_bits) /* Enter Low Power Mode 4 */ 116 000000 #define LPM4_EXIT _BIC_SR_IRQ(LPM4_bits) /* Exit Low Power Mode 4 */ 117 000000 #endif /* End #defines for C */ 118 000000 119 000000 /*********************************************** ************* 120 000000 * PERIPHERAL FILE MAP 121 000000 ************************************************ ************/ 122 000000 123 000000 /*********************************************** ************* 124 000000 * SPECIAL FUNCTION REGISTER ADDRESSES + CONTROL BITS 125 000000 ************************************************ ************/ 126 000000 127 000000 #define IE1_ (0x0000u) /* Interrupt Enable 1 */ 128 000000 DEFC( IE1 , IE1_) 129 000000 #define WDTIE (0x01) /* Watchdog Interrupt Enable */ 130 000000 #define OFIE (0x02) /* Osc. Fault Interrupt Enable */ 131 000000 #define NMIIE (0x10) /* NMI Interrupt Enable */ 132 000000 #define ACCVIE (0x20) /* Flash Access Violation Interrupt Enable */ 133 000000 134 000000 #define IFG1_ (0x0002u) /* Interrupt Flag 1 */ 135 000000 DEFC( IFG1 , IFG1_) 136 000000 #define WDTIFG (0x01) /* Watchdog Interrupt Flag */ 137 000000 #define OFIFG (0x02) /* Osc. Fault Interrupt Flag */ 138 000000 #define PORIFG (0x04) /* Power On Interrupt Flag */ 139 000000 #define RSTIFG (0x08) /* Reset Interrupt Flag */ 140 000000 #define NMIIFG (0x10) /* NMI Interrupt Flag */ 141 000000 142 000000 #define IE2_ (0x0001u) /* Interrupt Enable 2 */ 143 000000 DEFC( IE2 , IE2_) 144 000000 #define UC0IE IE2 145 000000 #define UCA0RXIE (0x01) 146 000000 #define UCA0TXIE (0x02) 147 000000 #define UCB0RXIE (0x04) 148 000000 #define UCB0TXIE (0x08) 149 000000 150 000000 #define IFG2_ (0x0003u) /* Interrupt Flag 2 */ 151 000000 DEFC( IFG2 , IFG2_) 152 000000 #define UC0IFG IFG2 153 000000 #define UCA0RXIFG (0x01) 154 000000 #define UCA0TXIFG (0x02) 155 000000 #define UCB0RXIFG (0x04) 156 000000 #define UCB0TXIFG (0x08) 157 000000 158 000000 /*********************************************** ************* 159 000000 * ADC10 160 000000 ************************************************ ************/ 161 000000 #define __MSP430_HAS_ADC10__ /* Definition to show that Module is available */ 162 000000 163 000000 #define ADC10DTC0_ (0x0048u) /* ADC10 Data Transfer Control 0 */ 164 000000 DEFC( ADC10DTC0 , ADC10DTC0_) 165 000000 #define ADC10DTC1_ (0x0049u) /* ADC10 Data Transfer Control 1 */ 166 000000 DEFC( ADC10DTC1 , ADC10DTC1_) 167 000000 #define ADC10AE0_ (0x004Au) /* ADC10 Analog Enable 0 */ 168 000000 DEFC( ADC10AE0 , ADC10AE0_) 169 000000 170 000000 #define ADC10CTL0_ (0x01B0u) /* ADC10 Control 0 */ 171 000000 DEFW( ADC10CTL0 , ADC10CTL0_) 172 000000 #define ADC10CTL1_ (0x01B2u) /* ADC10 Control 1 */ 173 000000 DEFW( ADC10CTL1 , ADC10CTL1_) 174 000000 #define ADC10MEM_ (0x01B4u) /* ADC10 Memory */ 175 000000 DEFW( ADC10MEM , ADC10MEM_) 176 000000 #define ADC10SA_ (0x01BCu) /* ADC10 Data Transfer Start Address */ 177 000000 DEFW( ADC10SA , ADC10SA_) 178 000000 179 000000 /* ADC10CTL0 */ 180 000000 #define ADC10SC (0x001) /* ADC10 Start Conversion */ 181 000000 #define ENC (0x002) /* ADC10 Enable Conversion */ 182 000000 #define ADC10IFG (0x004) /* ADC10 Interrupt Flag */ 183 000000 #define ADC10IE (0x008) /* ADC10 Interrupt Enalbe */ 184 000000 #define ADC10ON (0x010) /* ADC10 On/Enable */ 185 000000 #define REFON (0x020) /* ADC10 Reference on */ 186 000000 #define REF2_5V (0x040) /* ADC10 Ref 0:1.5V / 1:2.5V */ 187 000000 #define MSC (0x080) /* ADC10 Multiple SampleConversion */ 188 000000 #define REFBURST (0x100) /* ADC10 Reference Burst Mode */ 189 000000 #define REFOUT (0x200) /* ADC10 Enalbe output of Ref. */ 190 000000 #define ADC10SR (0x400) /* ADC10 Sampling Rate 0:200ksps / 1:50ksps */ 191 000000 #define ADC10SHT0 (0x800) /* ADC10 Sample Hold Select Bit: 0 */ 192 000000 #define ADC10SHT1 (0x1000u) /* ADC10 Sample Hold Select Bit: 1 */ 193 000000 #define SREF0 (0x2000u) /* ADC10 Reference Select Bit: 0 */ 194 000000 #define SREF1 (0x4000u) /* ADC10 Reference Select Bit: 1 */ 195 000000 #define SREF2 (0x8000u) /* ADC10 Reference Select Bit: 2 */ 196 000000 #define ADC10SHT_0 (0*0x800u) /* 4 x ADC10CLKs */ 197 000000 #define ADC10SHT_1 (1*0x800u) /* 8 x ADC10CLKs */ 198 000000 #define ADC10SHT_2 (2*0x800u) /* 16 x ADC10CLKs */ 199 000000 #define ADC10SHT_3 (3*0x800u) /* 64 x ADC10CLKs */ 200 000000 201 000000 #define SREF_0 (0*0x2000u) /* VR+ = AVCC and VR- = AVSS */ 202 000000 #define SREF_1 (1*0x2000u) /* VR+ = VREF+ and VR- = AVSS */ 203 000000 #define SREF_2 (2*0x2000u) /* VR+ = VEREF+ and VR- = AVSS */ 204 000000 #define SREF_3 (3*0x2000u) /* VR+ = VEREF+ and VR- = AVSS */ 205 000000 #define SREF_4 (4*0x2000u) /* VR+ = AVCC and VR- = VREF-/VEREF- */ 206 000000 #define SREF_5 (5*0x2000u) /* VR+ = VREF+ and VR- = VREF-/VEREF- */ 207 000000 #define SREF_6 (6*0x2000u) /* VR+ = VEREF+ and VR- = VREF-/VEREF- */ 208 000000 #define SREF_7 (7*0x2000u) /* VR+ = VEREF+ and VR- = VREF-/VEREF- */ 209 000000 210 000000 /* ADC10CTL1 */ 211 000000 #define ADC10BUSY (0x0001u) /* ADC10 BUSY */ 212 000000 #define CONSEQ0 (0x0002u) /* ADC10 Conversion Sequence Select 0 */ 213 000000 #define CONSEQ1 (0x0004u) /* ADC10 Conversion Sequence Select 1 */ 214 000000 #define ADC10SSEL0 (0x0008u) /* ADC10 Clock Source Select Bit: 0 */ 215 000000 #define ADC10SSEL1 (0x0010u) /* ADC10 Clock Source Select Bit: 1 */ 216 000000 #define ADC10DIV0 (0x0020u) /* ADC10 Clock Divider Select Bit: 0 */ 217 000000 #define ADC10DIV1 (0x0040u) /* ADC10 Clock Divider Select Bit: 1 */ 218 000000 #define ADC10DIV2 (0x0080u) /* ADC10 Clock Divider Select Bit: 2 */ 219 000000 #define ISSH (0x0100u) /* ADC10 Invert Sample Hold Signal */ 220 000000 #define ADC10DF (0x0200u) /* ADC10 Data Format 0:binary 1:2's complement */ 221 000000 #define SHS0 (0x0400u) /* ADC10 Sample/Hold Source Bit: 0 */ 222 000000 #define SHS1 (0x0800u) /* ADC10 Sample/Hold Source Bit: 1 */ 223 000000 #define INCH0 (0x1000u) /* ADC10 Input Channel Select Bit: 0 */ 224 000000 #define INCH1 (0x2000u) /* ADC10 Input Channel Select Bit: 1 */ 225 000000 #define INCH2 (0x4000u) /* ADC10 Input Channel Select Bit: 2 */ 226 000000 #define INCH3 (0x8000u) /* ADC10 Input Channel Select Bit: 3 */ 227 000000 228 000000 #define CONSEQ_0 (0*2u) /* Single channel single conversion */ 229 000000 #define CONSEQ_1 (1*2u) /* Sequence of channels */ 230 000000 #define CONSEQ_2 (2*2u) /* Repeat single channel */ 231 000000 #define CONSEQ_3 (3*2u) /* Repeat sequence of channels */ 232 000000 233 000000 #define ADC10SSEL_0 (0*8u) /* ADC10OSC */ 234 000000 #define ADC10SSEL_1 (1*8u) /* ACLK */ 235 000000 #define ADC10SSEL_2 (2*8u) /* MCLK */ 236 000000 #define ADC10SSEL_3 (3*8u) /* SMCLK */ 237 000000 238 000000 #define ADC10DIV_0 (0*0x20u) /* ADC10 Clock Divider Select 0 */ 239 000000 #define ADC10DIV_1 (1*0x20u) /* ADC10 Clock Divider Select 1 */ 240 000000 #define ADC10DIV_2 (2*0x20u) /* ADC10 Clock Divider Select 2 */ 241 000000 #define ADC10DIV_3 (3*0x20u) /* ADC10 Clock Divider Select 3 */ 242 000000 #define ADC10DIV_4 (4*0x20u) /* ADC10 Clock Divider Select 4 */ 243 000000 #define ADC10DIV_5 (5*0x20u) /* ADC10 Clock Divider Select 5 */ 244 000000 #define ADC10DIV_6 (6*0x20u) /* ADC10 Clock Divider Select 6 */ 245 000000 #define ADC10DIV_7 (7*0x20u) /* ADC10 Clock Divider Select 7 */ 246 000000 247 000000 #define SHS_0 (0*0x400u) /* ADC10SC */ 248 000000 #define SHS_1 (1*0x400u) /* TA3 OUT1 */ 249 000000 #define SHS_2 (2*0x400u) /* TA3 OUT0 */ 250 000000 #define SHS_3 (3*0x400u) /* TA3 OUT2 */ 251 000000 252 000000 #define INCH_0 (0*0x1000u) /* Selects Channel 0 */ 253 000000 #define INCH_1 (1*0x1000u) /* Selects Channel 1 */ 254 000000 #define INCH_2 (2*0x1000u) /* Selects Channel 2 */ 255 000000 #define INCH_3 (3*0x1000u) /* Selects Channel 3 */ 256 000000 #define INCH_4 (4*0x1000u) /* Selects Channel 4 */ 257 000000 #define INCH_5 (5*0x1000u) /* Selects Channel 5 */ 258 000000 #define INCH_6 (6*0x1000u) /* Selects Channel 6 */ 259 000000 #define INCH_7 (7*0x1000u) /* Selects Channel 7 */ 260 000000 #define INCH_8 (8*0x1000u) /* Selects Channel 8 */ 261 000000 #define INCH_9 (9*0x1000u) /* Selects Channel 9 */ 262 000000 #define INCH_10 (10*0x1000u) /* Selects Channel 10 */ 263 000000 #define INCH_11 (11*0x1000u) /* Selects Channel 11 */ 264 000000 #define INCH_12 (12*0x1000u) /* Selects Channel 12 */ 265 000000 #define INCH_13 (13*0x1000u) /* Selects Channel 13 */ 266 000000 #define INCH_14 (14*0x1000u) /* Selects Channel 14 */ 267 000000 #define INCH_15 (15*0x1000u) /* Selects Channel 15 */ 268 000000 269 000000 /* ADC10DTC0 */ 270 000000 #define ADC10FETCH (0x001) /* This bit should normally be reset */ 271 000000 #define ADC10B1 (0x002) /* ADC10 block one */ 272 000000 #define ADC10CT (0x004) /* ADC10 continuous transfer */ 273 000000 #define ADC10TB (0x008) /* ADC10 two-block mode */ 274 000000 #define ADC10DISABLE (0x000) /* ADC10DTC1 */ 275 000000 276 000000 /*********************************************** ************* 277 000000 * Basic Clock Module 278 000000 ************************************************ ************/ 279 000000 #define __MSP430_HAS_BC2__ /* Definition to show that Module is available */ 280 000000 281 000000 #define DCOCTL_ (0x0056u) /* DCO Clock Frequency Control */ 282 000000 DEFC( DCOCTL , DCOCTL_) 283 000000 #define BCSCTL1_ (0x0057u) /* Basic Clock System Control 1 */ 284 000000 DEFC( BCSCTL1 , BCSCTL1_) 285 000000 #define BCSCTL2_ (0x0058u) /* Basic Clock System Control 2 */ 286 000000 DEFC( BCSCTL2 , BCSCTL2_) 287 000000 #define BCSCTL3_ (0x0053u) /* Basic Clock System Control 3 */ 288 000000 DEFC( BCSCTL3 , BCSCTL3_) 289 000000 290 000000 #define MOD0 (0x01) /* Modulation Bit 0 */ 291 000000 #define MOD1 (0x02) /* Modulation Bit 1 */ 292 000000 #define MOD2 (0x04) /* Modulation Bit 2 */ 293 000000 #define MOD3 (0x08) /* Modulation Bit 3 */ 294 000000 #define MOD4 (0x10) /* Modulation Bit 4 */ 295 000000 #define DCO0 (0x20) /* DCO Select Bit 0 */ 296 000000 #define DCO1 (0x40) /* DCO Select Bit 1 */ 297 000000 #define DCO2 (0x80) /* DCO Select Bit 2 */ 298 000000 299 000000 #define RSEL0 (0x01) /* Range Select Bit 0 */ 300 000000 #define RSEL1 (0x02) /* Range Select Bit 1 */ 301 000000 #define RSEL2 (0x04) /* Range Select Bit 2 */ 302 000000 #define RSEL3 (0x08) /* Range Select Bit 3 */ 303 000000 #define DIVA0 (0x10) /* ACLK Divider 0 */ 304 000000 #define DIVA1 (0x20) /* ACLK Divider 1 */ 305 000000 #define XTS (0x40) /* LFXTCLK 0:Low Freq. / 1: High Freq. */ 306 000000 #define XT2OFF (0x80) /* Enable XT2CLK */ 307 000000 308 000000 #define DIVA_0 (0x00) /* ACLK Divider 0: /1 */ 309 000000 #define DIVA_1 (0x10) /* ACLK Divider 1: /2 */ 310 000000 #define DIVA_2 (0x20) /* ACLK Divider 2: /4 */ 311 000000 #define DIVA_3 (0x30) /* ACLK Divider 3: /8 */ 312 000000 313 000000 #define DIVS0 (0x02) /* SMCLK Divider 0 */ 314 000000 #define DIVS1 (0x04) /* SMCLK Divider 1 */ 315 000000 #define SELS (0x08) /* SMCLK Source Select 0:DCOCLK / 1:XT2CLK/LFXTCLK */ 316 000000 #define DIVM0 (0x10) /* MCLK Divider 0 */ 317 000000 #define DIVM1 (0x20) /* MCLK Divider 1 */ 318 000000 #define SELM0 (0x40) /* MCLK Source Select 0 */ 319 000000 #define SELM1 (0x80) /* MCLK Source Select 1 */ 320 000000 321 000000 #define DIVS_0 (0x00) /* SMCLK Divider 0: /1 */ 322 000000 #define DIVS_1 (0x02) /* SMCLK Divider 1: /2 */ 323 000000 #define DIVS_2 (0x04) /* SMCLK Divider 2: /4 */ 324 000000 #define DIVS_3 (0x06) /* SMCLK Divider 3: /8 */ 325 000000 326 000000 #define DIVM_0 (0x00) /* MCLK Divider 0: /1 */ 327 000000 #define DIVM_1 (0x10) /* MCLK Divider 1: /2 */ 328 000000 #define DIVM_2 (0x20) /* MCLK Divider 2: /4 */ 329 000000 #define DIVM_3 (0x30) /* MCLK Divider 3: /8 */ 330 000000 331 000000 #define SELM_0 (0x00) /* MCLK Source Select 0: DCOCLK */ 332 000000 #define SELM_1 (0x40) /* MCLK Source Select 1: DCOCLK */ 333 000000 #define SELM_2 (0x80) /* MCLK Source Select 2: XT2CLK/LFXTCLK */ 334 000000 #define SELM_3 (0xC0) /* MCLK Source Select 3: LFXTCLK */ 335 000000 336 000000 #define LFXT1OF (0x01) /* Low/high Frequency Oscillator Fault Flag */ 337 000000 #define XT2OF (0x02) /* High frequency oscillator 2 fault flag */ 338 000000 #define XCAP0 (0x04) /* XIN/XOUT Cap 0 */ 339 000000 #define XCAP1 (0x08) /* XIN/XOUT Cap 1 */ 340 000000 #define LFXT1S0 (0x10) /* Mode 0 for LFXT1 (XTS = 0) */ 341 000000 #define LFXT1S1 (0x20) /* Mode 1 for LFXT1 (XTS = 0) */ 342 000000 #define XT2S0 (0x40) /* Mode 0 for XT2 */ 343 000000 #define XT2S1 (0x80) /* Mode 1 for XT2 */ 344 000000 345 000000 #define XCAP_0 (0x00) /* XIN/XOUT Cap : 0 pF */ 346 000000 #define XCAP_1 (0x04) /* XIN/XOUT Cap : 6 pF */ 347 000000 #define XCAP_2 (0x08) /* XIN/XOUT Cap : 10 pF */ 348 000000 #define XCAP_3 (0x0C) /* XIN/XOUT Cap : 12.5 pF */ 349 000000 350 000000 #define LFXT1S_0 (0x00) /* Mode 0 for LFXT1 : Normal operation */ 351 000000 #define LFXT1S_1 (0x10) /* Mode 1 for LFXT1 : Reserved */ 352 000000 #define LFXT1S_2 (0x20) /* Mode 2 for LFXT1 : VLO */ 353 000000 #define LFXT1S_3 (0x30) /* Mode 3 for LFXT1 : Digital input signal */ 354 000000 355 000000 #define XT2S_0 (0x00) /* Mode 0 for XT2 : 0.4 - 1 MHz */ 356 000000 #define XT2S_1 (0x40) /* Mode 1 for XT2 : 1 - 4 MHz */ 357 000000 #define XT2S_2 (0x80) /* Mode 2 for XT2 : 2 - 16 MHz */ 358 000000 #define XT2S_3 (0xC0) /* Mode 3 for XT2 : Digital input signal */ 359 000000 360 000000 /*********************************************** ************* 361 000000 * Comparator A 362 000000 ************************************************ ************/ 363 000000 #define __MSP430_HAS_CAPLUS__ /* Definition to show that Module is available */ 364 000000 365 000000 #define CACTL1_ (0x0059u) /* Comparator A Control 1 */ 366 000000 DEFC( CACTL1 , CACTL1_) 367 000000 #define CACTL2_ (0x005Au) /* Comparator A Control 2 */ 368 000000 DEFC( CACTL2 , CACTL2_) 369 000000 #define CAPD_ (0x005Bu) /* Comparator A Port Disable */ 370 000000 DEFC( CAPD , CAPD_) 371 000000 372 000000 #define CAIFG (0x01) /* Comp. A Interrupt Flag */ 373 000000 #define CAIE (0x02) /* Comp. A Interrupt Enable */ 374 000000 #define CAIES (0x04) /* Comp. A Int. Edge Select: 0:rising / 1:falling */ 375 000000 #define CAON (0x08) /* Comp. A enable */ 376 000000 #define CAREF0 (0x10) /* Comp. A Internal Reference Select 0 */ 377 000000 #define CAREF1 (0x20) /* Comp. A Internal Reference Select 1 */ 378 000000 #define CARSEL (0x40) /* Comp. A Internal Reference Enable */ 379 000000 #define CAEX (0x80) /* Comp. A Exchange Inputs */ 380 000000 381 000000 #define CAREF_0 (0x00) /* Comp. A Int. Ref. Select 0 : Off */ 382 000000 #define CAREF_1 (0x10) /* Comp. A Int. Ref. Select 1 : 0.25*Vcc */ 383 000000 #define CAREF_2 (0x20) /* Comp. A Int. Ref. Select 2 : 0.5*Vcc */ 384 000000 #define CAREF_3 (0x30) /* Comp. A Int. Ref. Select 3 : Vt*/ 385 000000 386 000000 #define CAOUT (0x01) /* Comp. A Output */ 387 000000 #define CAF (0x02) /* Comp. A Enable Output Filter */ 388 000000 #define P2CA0 (0x04) /* Comp. A +Terminal Multiplexer */ 389 000000 #define P2CA1 (0x08) /* Comp. A -Terminal Multiplexer */ 390 000000 #define P2CA2 (0x10) /* Comp. A -Terminal Multiplexer */ 391 000000 #define P2CA3 (0x20) /* Comp. A -Terminal Multiplexer */ 392 000000 #define P2CA4 (0x40) /* Comp. A +Terminal Multiplexer */ 393 000000 #define CASHORT (0x80) /* Comp. A Short + and - Terminals */ 394 000000 395 000000 #define CAPD0 (0x01) /* Comp. A Disable Input Buffer of Port Register .0 */ 396 000000 #define CAPD1 (0x02) /* Comp. A Disable Input Buffer of Port Register .1 */ 397 000000 #define CAPD2 (0x04) /* Comp. A Disable Input Buffer of Port Register .2 */ 398 000000 #define CAPD3 (0x08) /* Comp. A Disable Input Buffer of Port Register .3 */ 399 000000 #define CAPD4 (0x10) /* Comp. A Disable Input Buffer of Port Register .4 */ 400 000000 #define CAPD5 (0x20) /* Comp. A Disable Input Buffer of Port Register .5 */ 401 000000 #define CAPD6 (0x40) /* Comp. A Disable Input Buffer of Port Register .6 */ 402 000000 #define CAPD7 (0x80) /* Comp. A Disable Input Buffer of Port Register .7 */ 403 000000 404 000000 /*********************************************** ************** 405 000000 * Flash Memory 406 000000 ************************************************ *************/ 407 000000 #define __MSP430_HAS_FLASH2__ /* Definition to show that Module is available */ 408 000000 409 000000 #define FCTL1_ (0x0128u) /* FLASH Control 1 */ 410 000000 DEFW( FCTL1 , FCTL1_) 411 000000 #define FCTL2_ (0x012Au) /* FLASH Control 2 */ 412 000000 DEFW( FCTL2 , FCTL2_) 413 000000 #define FCTL3_ (0x012Cu) /* FLASH Control 3 */ 414 000000 DEFW( FCTL3 , FCTL3_) 415 000000 416 000000 #define FRKEY (0x9600u) /* Flash key returned by read */ 417 000000 #define FWKEY (0xA500u) /* Flash key for write */ 418 000000 #define FXKEY (0x3300u) /* for use with XOR instruction */ 419 000000 420 000000 #define ERASE (0x0002u) /* Enable bit for Flash segment erase */ 421 000000 #define MERAS (0x0004u) /* Enable bit for Flash mass erase */ 422 000000 #define WRT (0x0040u) /* Enable bit for Flash write */ 423 000000 #define BLKWRT (0x0080u) /* Enable bit for Flash segment write */ 424 000000 #define SEGWRT (0x0080u) /* old definition */ /* Enable bit for Flash segment write */ 425 000000 426 000000 #define FN0 (0x0001u) /* Divide Flash clock by 1 to 64 using FN0 to FN5 according to: */ 427 000000 #define FN1 (0x0002u) /* 32*FN5 + 16*FN4 + 8*FN3 + 4*FN2 + 2*FN1 + FN0 + 1 */ 428 000000 #ifndef FN2 429 000000 #define FN2 (0x0004u) 430 000000 #endif 431 000000 #ifndef FN3 432 000000 #define FN3 (0x0008u) 433 000000 #endif 434 000000 #ifndef FN4 435 000000 #define FN4 (0x0010u) 436 000000 #endif 437 000000 #define FN5 (0x0020u) 438 000000 #define FSSEL0 (0x0040u) /* Flash clock select 0 */ /* to distinguish from USART SSELx */ 439 000000 #define FSSEL1 (0x0080u) /* Flash clock select 1 */ 440 000000 441 000000 #define FSSEL_0 (0x0000u) /* Flash clock select: 0 - ACLK */ 442 000000 #define FSSEL_1 (0x0040u) /* Flash clock select: 1 - MCLK */ 443 000000 #define FSSEL_2 (0x0080u) /* Flash clock select: 2 - SMCLK */ 444 000000 #define FSSEL_3 (0x00C0u) /* Flash clock select: 3 - SMCLK */ 445 000000 446 000000 #define BUSY (0x0001u) /* Flash busy: 1 */ 447 000000 #define KEYV (0x0002u) /* Flash Key violation flag */ 448 000000 #define ACCVIFG (0x0004u) /* Flash Access violation flag */ 449 000000 #define WAIT (0x0008u) /* Wait flag for segment write */ 450 000000 #define LOCK (0x0010u) /* Lock bit: 1 - Flash is locked (read only) */ 451 000000 #define EMEX (0x0020u) /* Flash Emergency Exit */ 452 000000 #define LOCKA (0x0040u) /* Segment A Lock bit: read = 1 - Segment is locked (read only) */ 453 000000 #define FAIL (0x0080u) /* Last Program or Erase failed */ 454 000000 455 000000 /*********************************************** ************* 456 000000 * DIGITAL I/O Port1/2 Pull up / Pull down Resistors 457 000000 ************************************************ ************/ 458 000000 #define __MSP430_HAS_PORT1_R__ /* Definition to show that Module is available */ 459 000000 #define __MSP430_HAS_PORT2_R__ /* Definition to show that Module is available */ 460 000000 461 000000 #define P1IN_ (0x0020u) /* Port 1 Input */ 462 000000 READ_ONLY DEFC( P1IN , P1IN_) 463 000000 #define P1OUT_ (0x0021u) /* Port 1 Output */ 464 000000 DEFC( P1OUT , P1OUT_) 465 000000 #define P1DIR_ (0x0022u) /* Port 1 Direction */ 466 000000 DEFC( P1DIR , P1DIR_) 467 000000 #define P1IFG_ (0x0023u) /* Port 1 Interrupt Flag */ 468 000000 DEFC( P1IFG , P1IFG_) 469 000000 #define P1IES_ (0x0024u) /* Port 1 Interrupt Edge Select */ 470 000000 DEFC( P1IES , P1IES_) 471 000000 #define P1IE_ (0x0025u) /* Port 1 Interrupt Enable */ 472 000000 DEFC( P1IE , P1IE_) 473 000000 #define P1SEL_ (0x0026u) /* Port 1 Selection */ 474 000000 DEFC( P1SEL , P1SEL_) 475 000000 #define P1SEL2_ (0x0041u) /* Port 1 Selection 2 */ 476 000000 DEFC( P1SEL2 , P1SEL2_) 477 000000 #define P1REN_ (0x0027u) /* Port 1 Resistor Enable */ 478 000000 DEFC( P1REN , P1REN_) 479 000000 480 000000 #define P2IN_ (0x0028u) /* Port 2 Input */ 481 000000 READ_ONLY DEFC( P2IN , P2IN_) 482 000000 #define P2OUT_ (0x0029u) /* Port 2 Output */ 483 000000 DEFC( P2OUT , P2OUT_) 484 000000 #define P2DIR_ (0x002Au) /* Port 2 Direction */ 485 000000 DEFC( P2DIR , P2DIR_) 486 000000 #define P2IFG_ (0x002Bu) /* Port 2 Interrupt Flag */ 487 000000 DEFC( P2IFG , P2IFG_) 488 000000 #define P2IES_ (0x002Cu) /* Port 2 Interrupt Edge Select */ 489 000000 DEFC( P2IES , P2IES_) 490 000000 #define P2IE_ (0x002Du) /* Port 2 Interrupt Enable */ 491 000000 DEFC( P2IE , P2IE_) 492 000000 #define P2SEL_ (0x002Eu) /* Port 2 Selection */ 493 000000 DEFC( P2SEL , P2SEL_) 494 000000 #define P2SEL2_ (0x0042u) /* Port 2 Selection 2 */ 495 000000 DEFC( P2SEL2 , P2SEL2_) 496 000000 #define P2REN_ (0x002Fu) /* Port 2 Resistor Enable */ 497 000000 DEFC( P2REN , P2REN_) 498 000000 499 000000 /*********************************************** ************* 500 000000 * DIGITAL I/O Port3 Pull up / Pull down Resistors 501 000000 ************************************************ ************/ 502 000000 #define __MSP430_HAS_PORT3_R__ /* Definition to show that Module is available */ 503 000000 504 000000 #define P3IN_ (0x0018u) /* Port 3 Input */ 505 000000 READ_ONLY DEFC( P3IN , P3IN_) 506 000000 #define P3OUT_ (0x0019u) /* Port 3 Output */ 507 000000 DEFC( P3OUT , P3OUT_) 508 000000 #define P3DIR_ (0x001Au) /* Port 3 Direction */ 509 000000 DEFC( P3DIR , P3DIR_) 510 000000 #define P3SEL_ (0x001Bu) /* Port 3 Selection */ 511 000000 DEFC( P3SEL , P3SEL_) 512 000000 #define P3SEL2_ (0x0043u) /* Port 3 Selection 2 */ 513 000000 DEFC( P3SEL2 , P3SEL2_) 514 000000 #define P3REN_ (0x0010u) /* Port 3 Resistor Enable */ 515 000000 DEFC( P3REN , P3REN_) 516 000000 517 000000 /*********************************************** ************* 518 000000 * Timer0_A3 519 000000 ************************************************ ************/ 520 000000 #define __MSP430_HAS_TA3__ /* Definition to show that Module is available */ 521 000000 522 000000 #define TA0IV_ (0x012Eu) /* Timer0_A3 Interrupt Vector Word */ 523 000000 READ_ONLY DEFW( TA0IV , TA0IV_) 524 000000 #define TA0CTL_ (0x0160u) /* Timer0_A3 Control */ 525 000000 DEFW( TA0CTL , TA0CTL_) 526 000000 #define TA0CCTL0_ (0x0162u) /* Timer0_A3 Capture/Compare Control 0 */ 527 000000 DEFW( TA0CCTL0 , TA0CCTL0_) 528 000000 #define TA0CCTL1_ (0x0164u) /* Timer0_A3 Capture/Compare Control 1 */ 529 000000 DEFW( TA0CCTL1 , TA0CCTL1_) 530 000000 #define TA0CCTL2_ (0x0166u) /* Timer0_A3 Capture/Compare Control 2 */ 531 000000 DEFW( TA0CCTL2 , TA0CCTL2_) 532 000000 #define TA0R_ (0x0170u) /* Timer0_A3 */ 533 000000 DEFW( TA0R , TA0R_) 534 000000 #define TA0CCR0_ (0x0172u) /* Timer0_A3 Capture/Compare 0 */ 535 000000 DEFW( TA0CCR0 , TA0CCR0_) 536 000000 #define TA0CCR1_ (0x0174u) /* Timer0_A3 Capture/Compare 1 */ 537 000000 DEFW( TA0CCR1 , TA0CCR1_) 538 000000 #define TA0CCR2_ (0x0176u) /* Timer0_A3 Capture/Compare 2 */ 539 000000 DEFW( TA0CCR2 , TA0CCR2_) 540 000000 541 000000 /* Alternate register names */ 542 000000 #define TAIV TA0IV /* Timer A Interrupt Vector Word */ 543 000000 #define TACTL TA0CTL /* Timer A Control */ 544 000000 #define TACCTL0 TA0CCTL0 /* Timer A Capture/Compare Control 0 */ 545 000000 #define TACCTL1 TA0CCTL1 /* Timer A Capture/Compare Control 1 */ 546 000000 #define TACCTL2 TA0CCTL2 /* Timer A Capture/Compare Control 2 */ 547 000000 #define TAR TA0R /* Timer A */ 548 000000 #define TACCR0 TA0CCR0 /* Timer A Capture/Compare 0 */ 549 000000 #define TACCR1 TA0CCR1 /* Timer A Capture/Compare 1 */ 550 000000 #define TACCR2 TA0CCR2 /* Timer A Capture/Compare 2 */ 551 000000 #define TAIV_ TA0IV_ /* Timer A Interrupt Vector Word */ 552 000000 #define TACTL_ TA0CTL_ /* Timer A Control */ 553 000000 #define TACCTL0_ TA0CCTL0_ /* Timer A Capture/Compare Control 0 */ 554 000000 #define TACCTL1_ TA0CCTL1_ /* Timer A Capture/Compare Control 1 */ 555 000000 #define TACCTL2_ TA0CCTL2_ /* Timer A Capture/Compare Control 2 */ 556 000000 #define TAR_ TA0R_ /* Timer A */ 557 000000 #define TACCR0_ TA0CCR0_ /* Timer A Capture/Compare 0 */ 558 000000 #define TACCR1_ TA0CCR1_ /* Timer A Capture/Compare 1 */ 559 000000 #define TACCR2_ TA0CCR2_ /* Timer A Capture/Compare 2 */ 560 000000 561 000000 /* Alternate register names 2 */ 562 000000 #define CCTL0 TACCTL0 /* Timer A Capture/Compare Control 0 */ 563 000000 #define CCTL1 TACCTL1 /* Timer A Capture/Compare Control 1 */ 564 000000 #define CCTL2 TACCTL2 /* Timer A Capture/Compare Control 2 */ 565 000000 #define CCR0 TACCR0 /* Timer A Capture/Compare 0 */ 566 000000 #define CCR1 TACCR1 /* Timer A Capture/Compare 1 */ 567 000000 #define CCR2 TACCR2 /* Timer A Capture/Compare 2 */ 568 000000 #define CCTL0_ TACCTL0_ /* Timer A Capture/Compare Control 0 */ 569 000000 #define CCTL1_ TACCTL1_ /* Timer A Capture/Compare Control 1 */ 570 000000 #define CCTL2_ TACCTL2_ /* Timer A Capture/Compare Control 2 */ 571 000000 #define CCR0_ TACCR0_ /* Timer A Capture/Compare 0 */ 572 000000 #define CCR1_ TACCR1_ /* Timer A Capture/Compare 1 */ 573 000000 #define CCR2_ TACCR2_ /* Timer A Capture/Compare 2 */ 574 000000 575 000000 #define TASSEL1 (0x0200u) /* Timer A clock source select 0 */ 576 000000 #define TASSEL0 (0x0100u) /* Timer A clock source select 1 */ 577 000000 #define ID1 (0x0080u) /* Timer A clock input divider 1 */ 578 000000 #define ID0 (0x0040u) /* Timer A clock input divider 0 */ 579 000000 #define MC1 (0x0020u) /* Timer A mode control 1 */ 580 000000 #define MC0 (0x0010u) /* Timer A mode control 0 */ 581 000000 #define TACLR (0x0004u) /* Timer A counter clear */ 582 000000 #define TAIE (0x0002u) /* Timer A counter interrupt enable */ 583 000000 #define TAIFG (0x0001u) /* Timer A counter interrupt flag */ 584 000000 585 000000 #define MC_0 (0*0x10u) /* Timer A mode control: 0 - Stop */ 586 000000 #define MC_1 (1*0x10u) /* Timer A mode control: 1 - Up to CCR0 */ 587 000000 #define MC_2 (2*0x10u) /* Timer A mode control: 2 - Continous up */ 588 000000 #define MC_3 (3*0x10u) /* Timer A mode control: 3 - Up/Down */ 589 000000 #define ID_0 (0*0x40u) /* Timer A input divider: 0 - /1 */ 590 000000 #define ID_1 (1*0x40u) /* Timer A input divider: 1 - /2 */ 591 000000 #define ID_2 (2*0x40u) /* Timer A input divider: 2 - /4 */ 592 000000 #define ID_3 (3*0x40u) /* Timer A input divider: 3 - /8 */ 593 000000 #define TASSEL_0 (0*0x100u) /* Timer A clock source select: 0 - TACLK */ 594 000000 #define TASSEL_1 (1*0x100u) /* Timer A clock source select: 1 - ACLK */ 595 000000 #define TASSEL_2 (2*0x100u) /* Timer A clock source select: 2 - SMCLK */ 596 000000 #define TASSEL_3 (3*0x100u) /* Timer A clock source select: 3 - INCLK */ 597 000000 598 000000 #define CM1 (0x8000u) /* Capture mode 1 */ 599 000000 #define CM0 (0x4000u) /* Capture mode 0 */ 600 000000 #define CCIS1 (0x2000u) /* Capture input select 1 */ 601 000000 #define CCIS0 (0x1000u) /* Capture input select 0 */ 602 000000 #define SCS (0x0800u) /* Capture sychronize */ 603 000000 #define SCCI (0x0400u) /* Latched capture signal (read) */ 604 000000 #define CAP (0x0100u) /* Capture mode: 1 /Compare mode : 0 */ 605 000000 #define OUTMOD2 (0x0080u) /* Output mode 2 */ 606 000000 #define OUTMOD1 (0x0040u) /* Output mode 1 */ 607 000000 #define OUTMOD0 (0x0020u) /* Output mode 0 */ 608 000000 #define CCIE (0x0010u) /* Capture/compare interrupt enable */ 609 000000 #define CCI (0x0008u) /* Capture input signal (read) */ 610 000000 #define OUT (0x0004u) /* PWM Output signal if output mode 0 */ 611 000000 #define COV (0x0002u) /* Capture/compare overflow flag */ 612 000000 #define CCIFG (0x0001u) /* Capture/compare interrupt flag */ 613 000000 614 000000 #define OUTMOD_0 (0*0x20u) /* PWM output mode: 0 - output only */ 615 000000 #define OUTMOD_1 (1*0x20u) /* PWM output mode: 1 - set */ 616 000000 #define OUTMOD_2 (2*0x20u) /* PWM output mode: 2 - PWM toggle/reset */ 617 000000 #define OUTMOD_3 (3*0x20u) /* PWM output mode: 3 - PWM set/reset */ 618 000000 #define OUTMOD_4 (4*0x20u) /* PWM output mode: 4 - toggle */ 619 000000 #define OUTMOD_5 (5*0x20u) /* PWM output mode: 5 - Reset */ 620 000000 #define OUTMOD_6 (6*0x20u) /* PWM output mode: 6 - PWM toggle/set */ 621 000000 #define OUTMOD_7 (7*0x20u) /* PWM output mode: 7 - PWM reset/set */ 622 000000 #define CCIS_0 (0*0x1000u) /* Capture input select: 0 - CCIxA */ 623 000000 #define CCIS_1 (1*0x1000u) /* Capture input select: 1 - CCIxB */ 624 000000 #define CCIS_2 (2*0x1000u) /* Capture input select: 2 - GND */ 625 000000 #define CCIS_3 (3*0x1000u) /* Capture input select: 3 - Vcc */ 626 000000 #define CM_0 (0*0x4000u) /* Capture mode: 0 - disabled */ 627 000000 #define CM_1 (1*0x4000u) /* Capture mode: 1 - pos. edge */ 628 000000 #define CM_2 (2*0x4000u) /* Capture mode: 1 - neg. edge */ 629 000000 #define CM_3 (3*0x4000u) /* Capture mode: 1 - both edges */ 630 000000 631 000000 /* T0_A3IV Definitions */ 632 000000 #define TA0IV_NONE (0x0000u) /* No Interrupt pending */ 633 000000 #define TA0IV_TACCR1 (0x0002u) /* TA0CCR1_CCIFG */ 634 000000 #define TA0IV_TACCR2 (0x0004u) /* TA0CCR2_CCIFG */ 635 000000 #define TA0IV_6 (0x0006u) /* Reserved */ 636 000000 #define TA0IV_8 (0x0008u) /* Reserved */ 637 000000 #define TA0IV_TAIFG (0x000Au) /* TA0IFG */ 638 000000 639 000000 /*********************************************** ************* 640 000000 * Timer1_A3 641 000000 ************************************************ ************/ 642 000000 #define __MSP430_HAS_T1A3__ /* Definition to show that Module is available */ 643 000000 644 000000 #define TA1IV_ (0x011Eu) /* Timer1_A3 Interrupt Vector Word */ 645 000000 READ_ONLY DEFW( TA1IV , TA1IV_) 646 000000 #define TA1CTL_ (0x0180u) /* Timer1_A3 Control */ 647 000000 DEFW( TA1CTL , TA1CTL_) 648 000000 #define TA1CCTL0_ (0x0182u) /* Timer1_A3 Capture/Compare Control 0 */ 649 000000 DEFW( TA1CCTL0 , TA1CCTL0_) 650 000000 #define TA1CCTL1_ (0x0184u) /* Timer1_A3 Capture/Compare Control 1 */ 651 000000 DEFW( TA1CCTL1 , TA1CCTL1_) 652 000000 #define TA1CCTL2_ (0x0186u) /* Timer1_A3 Capture/Compare Control 2 */ 653 000000 DEFW( TA1CCTL2 , TA1CCTL2_) 654 000000 #define TA1R_ (0x0190u) /* Timer1_A3 */ 655 000000 DEFW( TA1R , TA1R_) 656 000000 #define TA1CCR0_ (0x0192u) /* Timer1_A3 Capture/Compare 0 */ 657 000000 DEFW( TA1CCR0 , TA1CCR0_) 658 000000 #define TA1CCR1_ (0x0194u) /* Timer1_A3 Capture/Compare 1 */ 659 000000 DEFW( TA1CCR1 , TA1CCR1_) 660 000000 #define TA1CCR2_ (0x0196u) /* Timer1_A3 Capture/Compare 2 */ 661 000000 DEFW( TA1CCR2 , TA1CCR2_) 662 000000 663 000000 /* Bits are already defined within the Timer0_Ax */ 664 000000 665 000000 /* T1_A3IV Definitions */ 666 000000 #define TA1IV_NONE (0x0000u) /* No Interrupt pending */ 667 000000 #define TA1IV_TACCR1 (0x0002u) /* TA1CCR1_CCIFG */ 668 000000 #define TA1IV_TACCR2 (0x0004u) /* TA1CCR2_CCIFG */ 669 000000 #define TA1IV_TAIFG (0x000Au) /* TA1IFG */ 670 000000 671 000000 /*********************************************** ************* 672 000000 * USCI 673 000000 ************************************************ ************/ 674 000000 #define __MSP430_HAS_USCI__ /* Definition to show that Module is available */ 675 000000 676 000000 #define UCA0CTL0_ (0x0060u) /* USCI A0 Control Register 0 */ 677 000000 DEFC( UCA0CTL0 , UCA0CTL0_) 678 000000 #define UCA0CTL1_ (0x0061u) /* USCI A0 Control Register 1 */ 679 000000 DEFC( UCA0CTL1 , UCA0CTL1_) 680 000000 #define UCA0BR0_ (0x0062u) /* USCI A0 Baud Rate 0 */ 681 000000 DEFC( UCA0BR0 , UCA0BR0_) 682 000000 #define UCA0BR1_ (0x0063u) /* USCI A0 Baud Rate 1 */ 683 000000 DEFC( UCA0BR1 , UCA0BR1_) 684 000000 #define UCA0MCTL_ (0x0064u) /* USCI A0 Modulation Control */ 685 000000 DEFC( UCA0MCTL , UCA0MCTL_) 686 000000 #define UCA0STAT_ (0x0065u) /* USCI A0 Status Register */ 687 000000 DEFC( UCA0STAT , UCA0STAT_) 688 000000 #define UCA0RXBUF_ (0x0066u) /* USCI A0 Receive Buffer */ 689 000000 READ_ONLY DEFC( UCA0RXBUF , UCA0RXBUF_) 690 000000 #define UCA0TXBUF_ (0x0067u) /* USCI A0 Transmit Buffer */ 691 000000 DEFC( UCA0TXBUF , UCA0TXBUF_) 692 000000 #define UCA0ABCTL_ (0x005Du) /* USCI A0 LIN Control */ 693 000000 DEFC( UCA0ABCTL , UCA0ABCTL_) 694 000000 #define UCA0IRTCTL_ (0x005Eu) /* USCI A0 IrDA Transmit Control */ 695 000000 DEFC( UCA0IRTCTL , UCA0IRTCTL_) 696 000000 #define UCA0IRRCTL_ (0x005Fu) /* USCI A0 IrDA Receive Control */ 697 000000 DEFC( UCA0IRRCTL , UCA0IRRCTL_) 698 000000 699 000000 700 000000 701 000000 #define UCB0CTL0_ (0x0068u) /* USCI B0 Control Register 0 */ 702 000000 DEFC( UCB0CTL0 , UCB0CTL0_) 703 000000 #define UCB0CTL1_ (0x0069u) /* USCI B0 Control Register 1 */ 704 000000 DEFC( UCB0CTL1 , UCB0CTL1_) 705 000000 #define UCB0BR0_ (0x006Au) /* USCI B0 Baud Rate 0 */ 706 000000 DEFC( UCB0BR0 , UCB0BR0_) 707 000000 #define UCB0BR1_ (0x006Bu) /* USCI B0 Baud Rate 1 */ 708 000000 DEFC( UCB0BR1 , UCB0BR1_) 709 000000 #define UCB0I2CIE_ (0x006Cu) /* USCI B0 I2C Interrupt Enable Register */ 710 000000 DEFC( UCB0I2CIE , UCB0I2CIE_) 711 000000 #define UCB0STAT_ (0x006Du) /* USCI B0 Status Register */ 712 000000 DEFC( UCB0STAT , UCB0STAT_) 713 000000 #define UCB0RXBUF_ (0x006Eu) /* USCI B0 Receive Buffer */ 714 000000 READ_ONLY DEFC( UCB0RXBUF , UCB0RXBUF_) 715 000000 #define UCB0TXBUF_ (0x006Fu) /* USCI B0 Transmit Buffer */ 716 000000 DEFC( UCB0TXBUF , UCB0TXBUF_) 717 000000 #define UCB0I2COA_ (0x0118u) /* USCI B0 I2C Own Address */ 718 000000 DEFW( UCB0I2COA , UCB0I2COA_) 719 000000 #define UCB0I2CSA_ (0x011Au) /* USCI B0 I2C Slave Address */ 720 000000 DEFW( UCB0I2CSA , UCB0I2CSA_) 721 000000 722 000000 // UART-Mode Bits 723 000000 #define UCPEN (0x80) /* Async. Mode: Parity enable */ 724 000000 #define UCPAR (0x40) /* Async. Mode: Parity 0:odd / 1:even */ 725 000000 #define UCMSB (0x20) /* Async. Mode: MSB first 0:LSB / 1:MSB */ 726 000000 #define UC7BIT (0x10) /* Async. Mode: Data Bits 0:8-bits / 1:7-bits */ 727 000000 #define UCSPB (0x08) /* Async. Mode: Stop Bits 0:one / 1: two */ 728 000000 #define UCMODE1 (0x04) /* Async. Mode: USCI Mode 1 */ 729 000000 #define UCMODE0 (0x02) /* Async. Mode: USCI Mode 0 */ 730 000000 #define UCSYNC (0x01) /* Sync-Mode 0:UART-Mode / 1:SPI-Mode */ 731 000000 732 000000 // SPI-Mode Bits 733 000000 #define UCCKPH (0x80) /* Sync. Mode: Clock Phase */ 734 000000 #define UCCKPL (0x40) /* Sync. Mode: Clock Polarity */ 735 000000 #define UCMST (0x08) /* Sync. Mode: Master Select */ 736 000000 737 000000 // I2C-Mode Bits 738 000000 #define UCA10 (0x80) /* 10-bit Address Mode */ 739 000000 #define UCSLA10 (0x40) /* 10-bit Slave Address Mode */ 740 000000 #define UCMM (0x20) /* Multi-Master Environment */ 741 000000 //#define res (0x10) /* reserved */ 742 000000 #define UCMODE_0 (0x00) /* Sync. Mode: USCI Mode: 0 */ 743 000000 #define UCMODE_1 (0x02) /* Sync. Mode: USCI Mode: 1 */ 744 000000 #define UCMODE_2 (0x04) /* Sync. Mode: USCI Mode: 2 */ 745 000000 #define UCMODE_3 (0x06) /* Sync. Mode: USCI Mode: 3 */ 746 000000 747 000000 // UART-Mode Bits 748 000000 #define UCSSEL1 (0x80) /* USCI 0 Clock Source Select 1 */ 749 000000 #define UCSSEL0 (0x40) /* USCI 0 Clock Source Select 0 */ 750 000000 #define UCRXEIE (0x20) /* RX Error interrupt enable */ 751 000000 #define UCBRKIE (0x10) /* Break interrupt enable */ 752 000000 #define UCDORM (0x08) /* Dormant (Sleep) Mode */ 753 000000 #define UCTXADDR (0x04) /* Send next Data as Address */ 754 000000 #define UCTXBRK (0x02) /* Send next Data as Break */ 755 000000 #define UCSWRST (0x01) /* USCI Software Reset */ 756 000000 757 000000 // SPI-Mode Bits 758 000000 //#define res (0x20) /* reserved */ 759 000000 //#define res (0x10) /* reserved */ 760 000000 //#define res (0x08) /* reserved */ 761 000000 //#define res (0x04) /* reserved */ 762 000000 //#define res (0x02) /* reserved */ 763 000000 764 000000 // I2C-Mode Bits 765 000000 //#define res (0x20) /* reserved */ 766 000000 #define UCTR (0x10) /* Transmit/Receive Select/Flag */ 767 000000 #define UCTXNACK (0x08) /* Transmit NACK */ 768 000000 #define UCTXSTP (0x04) /* Transmit STOP */ 769 000000 #define UCTXSTT (0x02) /* Transmit START */ 770 000000 #define UCSSEL_0 (0x00) /* USCI 0 Clock Source: 0 */ 771 000000 #define UCSSEL_1 (0x40) /* USCI 0 Clock Source: 1 */ 772 000000 #define UCSSEL_2 (0x80) /* USCI 0 Clock Source: 2 */ 773 000000 #define UCSSEL_3 (0xC0) /* USCI 0 Clock Source: 3 */ 774 000000 775 000000 #define UCBRF3 (0x80) /* USCI First Stage Modulation Select 3 */ 776 000000 #define UCBRF2 (0x40) /* USCI First Stage Modulation Select 2 */ 777 000000 #define UCBRF1 (0x20) /* USCI First Stage Modulation Select 1 */ 778 000000 #define UCBRF0 (0x10) /* USCI First Stage Modulation Select 0 */ 779 000000 #define UCBRS2 (0x08) /* USCI Second Stage Modulation Select 2 */ 780 000000 #define UCBRS1 (0x04) /* USCI Second Stage Modulation Select 1 */ 781 000000 #define UCBRS0 (0x02) /* USCI Second Stage Modulation Select 0 */ 782 000000 #define UCOS16 (0x01) /* USCI 16-times Oversampling enable */ 783 000000 784 000000 #define UCBRF_0 (0x00) /* USCI First Stage Modulation: 0 */ 785 000000 #define UCBRF_1 (0x10) /* USCI First Stage Modulation: 1 */ 786 000000 #define UCBRF_2 (0x20) /* USCI First Stage Modulation: 2 */ 787 000000 #define UCBRF_3 (0x30) /* USCI First Stage Modulation: 3 */ 788 000000 #define UCBRF_4 (0x40) /* USCI First Stage Modulation: 4 */ 789 000000 #define UCBRF_5 (0x50) /* USCI First Stage Modulation: 5 */ 790 000000 #define UCBRF_6 (0x60) /* USCI First Stage Modulation: 6 */ 791 000000 #define UCBRF_7 (0x70) /* USCI First Stage Modulation: 7 */ 792 000000 #define UCBRF_8 (0x80) /* USCI First Stage Modulation: 8 */ 793 000000 #define UCBRF_9 (0x90) /* USCI First Stage Modulation: 9 */ 794 000000 #define UCBRF_10 (0xA0) /* USCI First Stage Modulation: A */ 795 000000 #define UCBRF_11 (0xB0) /* USCI First Stage Modulation: B */ 796 000000 #define UCBRF_12 (0xC0) /* USCI First Stage Modulation: C */ 797 000000 #define UCBRF_13 (0xD0) /* USCI First Stage Modulation: D */ 798 000000 #define UCBRF_14 (0xE0) /* USCI First Stage Modulation: E */ 799 000000 #define UCBRF_15 (0xF0) /* USCI First Stage Modulation: F */ 800 000000 801 000000 #define UCBRS_0 (0x00) /* USCI Second Stage Modulation: 0 */ 802 000000 #define UCBRS_1 (0x02) /* USCI Second Stage Modulation: 1 */ 803 000000 #define UCBRS_2 (0x04) /* USCI Second Stage Modulation: 2 */ 804 000000 #define UCBRS_3 (0x06) /* USCI Second Stage Modulation: 3 */ 805 000000 #define UCBRS_4 (0x08) /* USCI Second Stage Modulation: 4 */ 806 000000 #define UCBRS_5 (0x0A) /* USCI Second Stage Modulation: 5 */ 807 000000 #define UCBRS_6 (0x0C) /* USCI Second Stage Modulation: 6 */ 808 000000 #define UCBRS_7 (0x0E) /* USCI Second Stage Modulation: 7 */ 809 000000 810 000000 #define UCLISTEN (0x80) /* USCI Listen mode */ 811 000000 #define UCFE (0x40) /* USCI Frame Error Flag */ 812 000000 #define UCOE (0x20) /* USCI Overrun Error Flag */ 813 000000 #define UCPE (0x10) /* USCI Parity Error Flag */ 814 000000 #define UCBRK (0x08) /* USCI Break received */ 815 000000 #define UCRXERR (0x04) /* USCI RX Error Flag */ 816 000000 #define UCADDR (0x02) /* USCI Address received Flag */ 817 000000 #define UCBUSY (0x01) /* USCI Busy Flag */ 818 000000 #define UCIDLE (0x02) /* USCI Idle line detected Flag */ 819 000000 820 000000 //#define res (0x80) /* reserved */ 821 000000 //#define res (0x40) /* reserved */ 822 000000 //#define res (0x20) /* reserved */ 823 000000 //#define res (0x10) /* reserved */ 824 000000 #define UCNACKIE (0x08) /* NACK Condition interrupt enable */ 825 000000 #define UCSTPIE (0x04) /* STOP Condition interrupt enable */ 826 000000 #define UCSTTIE (0x02) /* START Condition interrupt enable */ 827 000000 #define UCALIE (0x01) /* Arbitration Lost interrupt enable */ 828 000000 829 000000 #define UCSCLLOW (0x40) /* SCL low */ 830 000000 #define UCGC (0x20) /* General Call address received Flag */ 831 000000 #define UCBBUSY (0x10) /* Bus Busy Flag */ 832 000000 #define UCNACKIFG (0x08) /* NAK Condition interrupt Flag */ 833 000000 #define UCSTPIFG (0x04) /* STOP Condition interrupt Flag */ 834 000000 #define UCSTTIFG (0x02) /* START Condition interrupt Flag */ 835 000000 #define UCALIFG (0x01) /* Arbitration Lost interrupt Flag */ 836 000000 837 000000 #define UCIRTXPL5 (0x80) /* IRDA Transmit Pulse Length 5 */ 838 000000 #define UCIRTXPL4 (0x40) /* IRDA Transmit Pulse Length 4 */ 839 000000 #define UCIRTXPL3 (0x20) /* IRDA Transmit Pulse Length 3 */ 840 000000 #define UCIRTXPL2 (0x10) /* IRDA Transmit Pulse Length 2 */ 841 000000 #define UCIRTXPL1 (0x08) /* IRDA Transmit Pulse Length 1 */ 842 000000 #define UCIRTXPL0 (0x04) /* IRDA Transmit Pulse Length 0 */ 843 000000 #define UCIRTXCLK (0x02) /* IRDA Transmit Pulse Clock Select */ 844 000000 #define UCIREN (0x01) /* IRDA Encoder/Decoder enable */ 845 000000 846 000000 #define UCIRRXFL5 (0x80) /* IRDA Receive Filter Length 5 */ 847 000000 #define UCIRRXFL4 (0x40) /* IRDA Receive Filter Length 4 */ 848 000000 #define UCIRRXFL3 (0x20) /* IRDA Receive Filter Length 3 */ 849 000000 #define UCIRRXFL2 (0x10) /* IRDA Receive Filter Length 2 */ 850 000000 #define UCIRRXFL1 (0x08) /* IRDA Receive Filter Length 1 */ 851 000000 #define UCIRRXFL0 (0x04) /* IRDA Receive Filter Length 0 */ 852 000000 #define UCIRRXPL (0x02) /* IRDA Receive Input Polarity */ 853 000000 #define UCIRRXFE (0x01) /* IRDA Receive Filter enable */ 854 000000 855 000000 //#define res (0x80) /* reserved */ 856 000000 //#define res (0x40) /* reserved */ 857 000000 #define UCDELIM1 (0x20) /* Break Sync Delimiter 1 */ 858 000000 #define UCDELIM0 (0x10) /* Break Sync Delimiter 0 */ 859 000000 #define UCSTOE (0x08) /* Sync-Field Timeout error */ 860 000000 #define UCBTOE (0x04) /* Break Timeout error */ 861 000000 //#define res (0x02) /* reserved */ 862 000000 #define UCABDEN (0x01) /* Auto Baud Rate detect enable */ 863 000000 864 000000 #define UCGCEN (0x8000u) /* I2C General Call enable */ 865 000000 #define UCOA9 (0x0200u) /* I2C Own Address 9 */ 866 000000 #define UCOA8 (0x0100u) /* I2C Own Address 8 */ 867 000000 #define UCOA7 (0x0080u) /* I2C Own Address 7 */ 868 000000 #define UCOA6 (0x0040u) /* I2C Own Address 6 */ 869 000000 #define UCOA5 (0x0020u) /* I2C Own Address 5 */ 870 000000 #define UCOA4 (0x0010u) /* I2C Own Address 4 */ 871 000000 #define UCOA3 (0x0008u) /* I2C Own Address 3 */ 872 000000 #define UCOA2 (0x0004u) /* I2C Own Address 2 */ 873 000000 #define UCOA1 (0x0002u) /* I2C Own Address 1 */ 874 000000 #define UCOA0 (0x0001u) /* I2C Own Address 0 */ 875 000000 876 000000 #define UCSA9 (0x0200u) /* I2C Slave Address 9 */ 877 000000 #define UCSA8 (0x0100u) /* I2C Slave Address 8 */ 878 000000 #define UCSA7 (0x0080u) /* I2C Slave Address 7 */ 879 000000 #define UCSA6 (0x0040u) /* I2C Slave Address 6 */ 880 000000 #define UCSA5 (0x0020u) /* I2C Slave Address 5 */ 881 000000 #define UCSA4 (0x0010u) /* I2C Slave Address 4 */ 882 000000 #define UCSA3 (0x0008u) /* I2C Slave Address 3 */ 883 000000 #define UCSA2 (0x0004u) /* I2C Slave Address 2 */ 884 000000 #define UCSA1 (0x0002u) /* I2C Slave Address 1 */ 885 000000 #define UCSA0 (0x0001u) /* I2C Slave Address 0 */ 886 000000 887 000000 /*********************************************** ************* 888 000000 * WATCHDOG TIMER 889 000000 ************************************************ ************/ 890 000000 #define __MSP430_HAS_WDT__ /* Definition to show that Module is available */ 891 000000 892 000000 #define WDTCTL_ (0x0120u) /* Watchdog Timer Control */ 893 000000 DEFW( WDTCTL , WDTCTL_) 894 000000 /* The bit names have been prefixed with "WDT" */ 895 000000 #define WDTIS0 (0x0001u) 896 000000 #define WDTIS1 (0x0002u) 897 000000 #define WDTSSEL (0x0004u) 898 000000 #define WDTCNTCL (0x0008u) 899 000000 #define WDTTMSEL (0x0010u) 900 000000 #define WDTNMI (0x0020u) 901 000000 #define WDTNMIES (0x0040u) 902 000000 #define WDTHOLD (0x0080u) 903 000000 904 000000 #define WDTPW (0x5A00u) 905 000000 906 000000 /* WDT-interval times [1ms] coded with Bits 0-2 */ 907 000000 /* WDT is clocked by fSMCLK (assumed 1MHz) */ 908 000000 #define WDT_MDLY_32 (WDTPW+WDTTMSEL+WDTC NTCL) /* 32ms interval (default) */ 909 000000 #define WDT_MDLY_8 (WDTPW+WDTTMSEL+WDTC NTCL+WDTIS0) /* 8ms " */ 910 000000 #define WDT_MDLY_0_5 (WDTPW+WDTTMSEL+WDTC NTCL+WDTIS1) /* 0.5ms " */ 911 000000 #define WDT_MDLY_0_064 (WDTPW+WDTTMSEL+WDTC NTCL+WDTIS1+WDTIS0) /* 0.064ms " */ 912 000000 /* WDT is clocked by fACLK (assumed 32KHz) */ 913 000000 #define WDT_ADLY_1000 (WDTPW+WDTTMSEL+WDTC NTCL+WDTSSEL) /* 1000ms " */ 914 000000 #define WDT_ADLY_250 (WDTPW+WDTTMSEL+WDTC NTCL+WDTSSEL+WDTIS0) /* 250ms " */ 915 000000 #define WDT_ADLY_16 (WDTPW+WDTTMSEL+WDTC NTCL+WDTSSEL+WDTIS1) /* 16ms " */ 916 000000 #define WDT_ADLY_1_9 (WDTPW+WDTTMSEL+WDTC NTCL+WDTSSEL+WDTIS1+WDTIS0) /* 1.9ms " */ 917 000000 /* Watchdog mode -> reset after expired time */ 918 000000 /* WDT is clocked by fSMCLK (assumed 1MHz) */ 919 000000 #define WDT_MRST_32 (WDTPW+WDTCNTCL) /* 32ms interval (default) */ 920 000000 #define WDT_MRST_8 (WDTPW+WDTCNTCL+WDTI S0) /* 8ms " */ 921 000000 #define WDT_MRST_0_5 (WDTPW+WDTCNTCL+WDTI S1) /* 0.5ms " */ 922 000000 #define WDT_MRST_0_064 (WDTPW+WDTCNTCL+WDTI S1+WDTIS0) /* 0.064ms " */ 923 000000 /* WDT is clocked by fACLK (assumed 32KHz) */ 924 000000 #define WDT_ARST_1000 (WDTPW+WDTCNTCL+WDTS SEL) /* 1000ms " */ 925 000000 #define WDT_ARST_250 (WDTPW+WDTCNTCL+WDTS SEL+WDTIS0) /* 250ms " */ 926 000000 #define WDT_ARST_16 (WDTPW+WDTCNTCL+WDTS SEL+WDTIS1) /* 16ms " */ 927 000000 #define WDT_ARST_1_9 (WDTPW+WDTCNTCL+WDTS SEL+WDTIS1+WDTIS0) /* 1.9ms " */ 928 000000 929 000000 /* INTERRUPT CONTROL */ 930 000000 /* These two bits are defined in the Special Function Registers */ 931 000000 /* #define WDTIE 0x01 */ 932 000000 /* #define WDTIFG 0x01 */ 933 000000 934 000000 /*********************************************** ************* 935 000000 * Calibration Data in Info Mem 936 000000 ************************************************ ************/ 937 000000 938 000000 #ifndef __DisableCalData 939 000000 940 000000 #define CALDCO_16MHZ_ (0x10F8u) /* DCOCTL Calibration Data for 16MHz */ 941 000000 READ_ONLY DEFC( CALDCO_16MHZ , CALDCO_16MHZ_ ) 942 000000 #define CALBC1_16MHZ_ (0x10F9u) /* BCSCTL1 Calibration Data for 16MHz */ 943 000000 READ_ONLY DEFC( CALBC1_16MHZ , CALBC1_16MHZ_ ) 944 000000 #define CALDCO_12MHZ_ (0x10FAu) /* DCOCTL Calibration Data for 12MHz */ 945 000000 READ_ONLY DEFC( CALDCO_12MHZ , CALDCO_12MHZ_ ) 946 000000 #define CALBC1_12MHZ_ (0x10FBu) /* BCSCTL1 Calibration Data for 12MHz */ 947 000000 READ_ONLY DEFC( CALBC1_12MHZ , CALBC1_12MHZ_ ) 948 000000 #define CALDCO_8MHZ_ (0x10FCu) /* DCOCTL Calibration Data for 8MHz */ 949 000000 READ_ONLY DEFC( CALDCO_8MHZ , CALDCO_8MHZ_) 950 000000 #define CALBC1_8MHZ_ (0x10FDu) /* BCSCTL1 Calibration Data for 8MHz */ 951 000000 READ_ONLY DEFC( CALBC1_8MHZ , CALBC1_8MHZ_) 952 000000 #define CALDCO_1MHZ_ (0x10FEu) /* DCOCTL Calibration Data for 1MHz */ 953 000000 READ_ONLY DEFC( CALDCO_1MHZ , CALDCO_1MHZ_) 954 000000 #define CALBC1_1MHZ_ (0x10FFu) /* BCSCTL1 Calibration Data for 1MHz */ 955 000000 READ_ONLY DEFC( CALBC1_1MHZ , CALBC1_1MHZ_) 956 000000 957 000000 #endif /* #ifndef __DisableCalData */ 958 000000 959 000000 /*********************************************** ************* 960 000000 * Interrupt Vectors (offset from 0xFFE0) 961 000000 ************************************************ ************/ 962 000000 963 000000 #define PORT1_VECTOR (2 * 2u) /* 0xFFE4 Port 1 */ 964 000000 #define PORT2_VECTOR (3 * 2u) /* 0xFFE6 Port 2 */ 965 000000 #define ADC10_VECTOR (5 * 2u) /* 0xFFEA ADC10 */ 966 000000 #define USCIAB0TX_VECTOR (6 * 2u) /* 0xFFEC USCI A0/B0 Transmit */ 967 000000 #define USCIAB0RX_VECTOR (7 * 2u) /* 0xFFEE USCI A0/B0 Receive */ 968 000000 #define TIMER0_A1_VECTOR (8 * 2u) /* 0xFFF0 Timer0)A CC1, TA0 */ 969 000000 #define TIMER0_A0_VECTOR (9 * 2u) /* 0xFFF2 Timer0_A CC0 */ 970 000000 #define WDT_VECTOR (10 * 2u) /* 0xFFF4 Watchdog Timer */ 971 000000 #define COMPARATORA_VECTOR (11 * 2u) /* 0xFFF6 Comparator A */ 972 000000 #define TIMER1_A1_VECTOR (12 * 2u) /* 0xFFF8 Timer1_A CC1-4, TA1 */ 973 000000 #define TIMER1_A0_VECTOR (13 * 2u) /* 0xFFFA Timer1_A CC0 */ 974 000000 #define NMI_VECTOR (14 * 2u) /* 0xFFFC Non-maskable */ 975 000000 #define RESET_VECTOR (15 * 2u) /* 0xFFFE Reset [Highest Priority] */ 976 000000 977 000000 /*********************************************** ************* 978 000000 * End of Modules 979 000000 ************************************************ ************/ 980 000000 #pragma language=default 981 000000 982 000000 #endif /* #ifndef __MSP430G2553 */ 983 000000 986 000000 987 000000 #elif defined (__MSP430G2203__) 988 000000 #include "msp430g2203.h" 990 000000 #elif defined (__MSP430G2303__) 991 000000 #include "msp430g2303.h" 993 000000 #elif defined (__MSP430G2403__) 994 000000 #include "msp430g2403.h" 996 000000 #elif defined (__MSP430G2233__) 997 000000 #include "msp430g2233.h" 999 000000 #elif defined (__MSP430G2333__) 1000 000000 #include "msp430g2333.h" 1002 000000 #elif defined (__MSP430G2433__) 1003 000000 #include "msp430g2433.h" 1005 000000 #elif defined (__MSP430G2533__) 1006 000000 #include "msp430g2533.h" 1008 000000 #elif defined (__MSP430BT5190__) 1009 000000 #include "msp430bt5190.h" 1014 000000 #elif defined (__MSP430GENERIC__) 1015 000000 #error "msp430 generic device does not have a default include file" 1017 000000 #elif defined (__MSP430XGENERIC__) 1018 000000 #error "msp430X generic device does not have a default include file" 1024 000000 #else 1025 000000 #error "Failed to match a default include file" 1026 000000 #endif 1027 000000 1028 000000 #endif /* #ifndef __msp430 */ 1029 000000 29 000000 #include "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 (0x03FF) // ok mk 31 000000 #define FLASHSTART (0xC000) // ok mk 32 000000 #define FLASHEND (0xDFFF) // ok mk 33 000000 #define MAINSEG (512) // wozu ?? mk 34 000000 #define INFOSEG (128) // ?? mk 35 000000 36 000000 // ; FORTH REGISTER USAGE 37 000000 38 000000 // ; Forth virtual machine 39 000000 #define RSP SP 40 000000 #define PSP R4 41 000000 #define IP R5 42 000000 #define W R6 43 000000 #define TOS R7 44 000000 45 000000 // ; Loop parameters in registers 46 000000 #define INDEX R8 47 000000 #define LIMIT R9 48 000000 49 000000 // ; Scratch registers 50 000000 #define X R10 51 000000 #define Y R11 52 000000 #define Q R12 53 000000 #define T R13 54 000000 55 000000 // ; T.I. Integer Subroutines Definitions 56 000000 #define IROP1 TOS 57 000000 #define IROP2L R10 58 000000 #define IROP2M R11 59 000000 #define IRACL R12 60 000000 #define IRACM R13 61 000000 #define IRBT W 62 000000 63 000000 // ; INDIRECT-THREADED NEXT 64 000000 69 000000 70 000000 // ; BRANCH DESTINATION (RELATIVE BRANCH) 71 000000 // ; For relative branch addresses, i.e., a branch is ADD @IP,IP 72 000000 76 000000 77 000000 // ; HEADER CONSTRUCTION MACROS 78 000000 93 000000 102 000000 117 000000 30 000000 31 000000 EXTERN UP,UAREA,PADAREA,LSTACK,PSTACK,R STACK 32 000000 EXTERN TIBAREA,RAMDICT,ROMDICT 33 000000 EXTERN TIB_SIZE,UAREA_SIZE,nullirq 34 000000 35 000000 RSEG CODE ; place program in 'CODE' segment 36 000000 37 000000 link SET 0 ; initial dictionary link 38 000000 39 000000 version: 40 000000 19 DB (verend-ver0) 41 000001 344534746820*ver0: DB '4E4th R0.34 ',__date__,'|' ; R = Release Version 42 00001A EVEN 43 00001A verend: 44 00001A 45 00001A ; ---------------------------------------------- ------------------------ 46 00001A ; INTERPRETER LOGIC 47 00001A ; ITC NEXT is defined as 48 00001A ; MOV @IP+,W ; 2 fetch word address into W 49 00001A ; MOV @W+,PC ; 2 fetch code address into PC, W=PFA 50 00001A 51 00001A ;C EXECUTE i*x xt -- j*x execute Forth word at 'xt' 52 00001A HEADER EXECUTE,7,'EXECUTE',DOCODE 52.1 000000 PUBLIC EXECUTE 52.2 00001A 0000 DW link 52.3 00001C FF DB 0FFh ; not immediate 52.4 00001D link SET $ 52.5 00001D 07 DB 7 52.6 00001E 455845435554* DB 'EXECUTE' 52.7 000025 00 EVEN 52.8 000026 IF 'DOCODE'='DOCODE' 52.9 000026 .... EXECUTE: DW $+2 52.10 000028 ELSE 52.11 000028 EXECUTE: DW DOCODE 52.12 000028 ENDIF 52.13 000028 ENDM 53 000028 0647 MOV TOS,W ; 1 put word address into W 54 00002A 3744 MOV @PSP+,TOS ; 2 fetch new TOS 55 00002C 3046 MOV @W+,PC ; 2 fetch code address into PC, W=PFA 56 00002E 57 00002E ;Z lit -- x fetch inline literal to stack 58 00002E ; This is the primtive compiled by LITERAL. 59 00002E HEADER lit,3,'lit',DOCODE 59.1 000000 PUBLIC lit 59.2 00002E .... DW link 59.3 000030 FF DB 0FFh ; not immediate 59.4 000031 link SET $ 59.5 000031 03 DB 3 59.6 000032 6C6974 DB 'lit' 59.7 000035 00 EVEN 59.8 000036 IF 'DOCODE'='DOCODE' 59.9 000036 .... lit: DW $+2 59.10 000038 ELSE 59.11 000038 lit: DW DOCODE 59.12 000038 ENDIF 59.13 000038 ENDM 60 000038 2483 SUB #2,PSP ; 1 push old TOS.. 61 00003A 84470000 MOV TOS,0(PSP) ; 4 ..onto stack 62 00003E 3745 MOV @IP+,TOS ; 2 fetch new TOS value 63 000040 NEXT ; 4 63.1 000040 3645 MOV @IP+,W // ; fetch word address into W 63.2 000042 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 63.3 000044 ENDM 64 000044 65 000044 ;C EXIT -- exit a colon definition 66 000044 HEADER EXIT,4,'EXIT',DOCODE 66.1 000000 PUBLIC EXIT 66.2 000044 .... DW link 66.3 000046 FF DB 0FFh ; not immediate 66.4 000047 link SET $ 66.5 000047 04 DB 4 66.6 000048 45584954 DB 'EXIT' 66.7 00004C EVEN 66.8 00004C IF 'DOCODE'='DOCODE' 66.9 00004C .... EXIT: DW $+2 66.10 00004E ELSE 66.11 00004E EXIT: DW DOCODE 66.12 00004E ENDIF 66.13 00004E ENDM 67 00004E 3541 MOV @RSP+,IP ; 2 pop old IP from return stack 68 000050 NEXT ; 4 68.1 000050 3645 MOV @IP+,W // ; fetch word address into W 68.2 000052 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 68.3 000054 ENDM 69 000054 70 000054 ; ---------------------------------------------- ------------------------ 71 000054 ; DEFINING WORDS - ROMable ITC model 72 000054 73 000054 ; DOCOLON enters a new high-level thread (colon definition.) 74 000054 ; (internal code fragment, not a Forth word) 75 000000 PUBLIC DOCOLON 76 000054 DOCOLON: 77 000054 0512 PUSH IP ; 3 save old IP on return stack 78 000056 0546 MOV W,IP ; 1 set new IP to PFA 79 000058 NEXT ; 4 79.1 000058 3645 MOV @IP+,W // ; fetch word address into W 79.2 00005A 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 79.3 00005C ENDM 80 00005C 81 00005C ;C VARIABLE -- define a Forth VARIABLE 82 00005C ; CREATE CELL ALLOT ; 83 00005C ; Action of ROMable variable is the same as CREATE; it builds a 84 00005C ; constant holding the RAM address. See CREATE in hilvl430.s43. 85 00005C HEADER VARIABLE,8,'VARIABLE',DOCOLON 85.1 000000 PUBLIC VARIABLE 85.2 00005C .... DW link 85.3 00005E FF DB 0FFh ; not immediate 85.4 00005F link SET $ 85.5 00005F 08 DB 8 85.6 000060 564152494142* DB 'VARIABLE' 85.7 000068 EVEN 85.8 000068 IF 'DOCOLON'='DOCODE' 85.9 000068 VARIABLE: DW $+2 85.10 000068 ELSE 85.11 000068 .... VARIABLE: DW DOCOLON 85.12 00006A ENDIF 85.13 00006A ENDM 86 00006A ............* DW CREATE,CELL,ALLOT,EXIT 87 000072 88 000072 ;C CONSTANT -- define a Forth constant 89 000072 ; (machine code fragment) 91 000072 ; Note that the constant is stored in Code space. 92 000072 HEADER CONSTANT,8,'CONSTANT',DOCOLON 92.1 000000 PUBLIC CONSTANT 92.2 000072 .... DW link 92.3 000074 FF DB 0FFh ; not immediate 92.4 000075 link SET $ 92.5 000075 08 DB 8 92.6 000076 434F4E535441* DB 'CONSTANT' 92.7 00007E EVEN 92.8 00007E IF 'DOCOLON'='DOCODE' 92.9 00007E CONSTANT: DW $+2 92.10 00007E ELSE 92.11 00007E .... CONSTANT: DW DOCOLON 92.12 000080 ENDIF 92.13 000080 ENDM 93 000080 ............ DW BUILDS,ICOMMA,XDOES 94 000086 ; DOCON, code action of CONSTANT, 95 000086 ; entered with W=Parameter Field Adrs 96 000086 ; This is also the action of VARIABLE (Harvard model) 97 000086 ; This is also the action of CREATE (Harvard model) 98 000000 PUBLIC DOCON 99 000000 PUBLIC docreate 100 000000 PUBLIC DOVAR 101 000086 docreate: ; -- a-addr ; ROMable CREATE fetches address from PFA 102 000086 DOVAR: ; -- a-addr ; ROMable VARIABLE fetches address from PFA 103 000086 DOCON: ; -- x ; CONSTANT fetches cell from PFA to TOS 104 000086 2483 SUB #2,PSP ; make room on stack 105 000088 84470000 MOV TOS,0(PSP) 106 00008C 2746 MOV @W,TOS ; fetch from parameter field to TOS 107 00008E NEXT 107.1 00008E 3645 MOV @IP+,W // ; fetch word address into W 107.2 000090 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 107.3 000092 ENDM 108 000092 109 000092 ; DOCREATE's action is for a table in RAM. 110 000092 ; DOROM is the code action for a table in ROM; 111 000092 ; it returns the address of the parameter field. 112 000000 PUBLIC DOROM 113 000092 DOROM: ; -- a-addr ; Table in ROM: get PFA into TOS 114 000092 2483 SUB #2,PSP 115 000094 84470000 MOV TOS,0(PSP) 116 000098 0746 MOV W,TOS 117 00009A NEXT 117.1 00009A 3645 MOV @IP+,W // ; fetch word address into W 117.2 00009C 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 117.3 00009E ENDM 118 00009E 119 00009E ;Z USER n -- define user variable 'n' 120 00009E ; (machine code fragment) Flashable model 121 00009E HEADER USER,4,'USER',DOCOLON 121.1 000000 PUBLIC USER 121.2 00009E .... DW link 121.3 0000A0 FF DB 0FFh ; not immediate 121.4 0000A1 link SET $ 121.5 0000A1 04 DB 4 121.6 0000A2 55534552 DB 'USER' 121.7 0000A6 EVEN 121.8 0000A6 IF 'DOCOLON'='DOCODE' 121.9 0000A6 USER: DW $+2 121.10 0000A6 ELSE 121.11 0000A6 .... USER: DW DOCOLON 121.12 0000A8 ENDIF 121.13 0000A8 ENDM 122 0000A8 ............ DW BUILDS,ICOMMA,XDOES 123 000000 PUBLIC DOUSER 124 0000AE DOUSER: ; -- a-addr ; add constant to User Pointer, result in TOS 125 0000AE 2483 SUB #2,PSP 126 0000B0 84470000 MOV TOS,0(PSP) 127 0000B4 2746 MOV @W,TOS 128 0000B6 1752.... ADD &UP,TOS 129 0000BA NEXT 129.1 0000BA 3645 MOV @IP+,W // ; fetch word address into W 129.2 0000BC 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 129.3 0000BE ENDM 130 0000BE 131 0000BE ; DOALIAS used to build a word which performs the action of 132 0000BE ; another word. Its action is to fetch the "alias" CFA from 133 0000BE ; the parameter field, and execute that, e.g. DOES> I@ EXECUTE ; 134 0000BE ; This is currently used only within the Forth kernel. 135 000000 PUBLIC DOALIAS 136 0000BE DOALIAS: ; -- ; fetch CFA of word to execute 137 0000BE 2646 MOV @W,W ; 2 fetch from parameter field to W 138 0000C0 3046 MOV @W+,PC ; 2 fetch code address into PC, W=PFA 139 0000C2 140 0000C2 ; DODOES is the code action of a DOES> clause. For ITC Forth: 141 0000C2 ; defined word: CFA: doescode 142 0000C2 ; PFA: parameter field 143 0000C2 ; 144 0000C2 ; doescode: MOV #DODOES,PC ; 16-bit direct jump, in two cells 145 0000C2 ; high-level thread 146 0000C2 ; 147 0000C2 ; Note that we use JMP DODOES instead of CALL #DODOES because we can 148 0000C2 ; efficiently obtain the thread address. DODOES is entered with W=PFA. 149 0000C2 ; It enters the high-level thread with the address of the parameter 150 0000C2 ; field on top of stack. 151 0000C2 152 000000 PUBLIC dodoes 153 0000C2 dodoes: ; -- a-addr ; 3 for MOV #DODOES,PC 154 0000C2 2483 SUB #2,PSP ; 1 make room on stack 155 0000C4 84470000 MOV TOS,0(PSP) ; 4 156 0000C8 0746 MOV W,TOS ; 1 put defined word's PFA in TOS 157 0000CA 0512 PUSH IP ; 3 save old IP on return stack 158 0000CC 1546FEFF MOV -2(W),IP ; 3 fetch adrs of doescode from defined word 159 0000D0 2552 ADD #4,IP ; 1 skip MOV instruction to get thread adrs 160 0000D2 NEXT ; 4 160.1 0000D2 3645 MOV @IP+,W // ; fetch word address into W 160.2 0000D4 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 160.3 0000D6 ENDM 161 0000D6 162 0000D6 ; OPTION 1 ; OPTION 2 163 0000D6 ; MOV #DODOES,PC 3 ; CALL #DODOES 5 164 0000D6 ; ... ; ... 165 0000D6 ; PUSH IP 3 ; POP W 2 166 0000D6 ; MOVE -2(W),IP 3 ; PUSH IP 3 167 0000D6 ; ADD #4,IP 1 ; MOV W,IP 1 168 0000D6 169 0000D6 170 0000D6 ; ---------------------------------------------- ------------------------ 171 0000D6 ; STACK OPERATIONS 172 0000D6 173 0000D6 ;C DUP x -- x x duplicate top of stack 174 0000D6 HEADER DUP,3,'DUP',DOCODE 174.1 000000 PUBLIC DUP 174.2 0000D6 .... DW link 174.3 0000D8 FF DB 0FFh ; not immediate 174.4 0000D9 link SET $ 174.5 0000D9 03 DB 3 174.6 0000DA 445550 DB 'DUP' 174.7 0000DD 00 EVEN 174.8 0000DE IF 'DOCODE'='DOCODE' 174.9 0000DE .... DUP: DW $+2 174.10 0000E0 ELSE 174.11 0000E0 DUP: DW DOCODE 174.12 0000E0 ENDIF 174.13 0000E0 ENDM 175 0000E0 2483 PUSHTOS: SUB #2,PSP ; 1 push old TOS.. 176 0000E2 84470000 MOV TOS,0(PSP) ; 4 ..onto stack 177 0000E6 NEXT ; 4 177.1 0000E6 3645 MOV @IP+,W // ; fetch word address into W 177.2 0000E8 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 177.3 0000EA ENDM 178 0000EA 179 0000EA ;C ?DUP x -- 0 | x x DUP if nonzero 180 0000EA HEADER QDUP,4,'?DUP',DOCODE 180.1 000000 PUBLIC QDUP 180.2 0000EA .... DW link 180.3 0000EC FF DB 0FFh ; not immediate 180.4 0000ED link SET $ 180.5 0000ED 04 DB 4 180.6 0000EE 3F445550 DB '?DUP' 180.7 0000F2 EVEN 180.8 0000F2 IF 'DOCODE'='DOCODE' 180.9 0000F2 .... QDUP: DW $+2 180.10 0000F4 ELSE 180.11 0000F4 QDUP: DW DOCODE 180.12 0000F4 ENDIF 180.13 0000F4 ENDM 181 0000F4 0793 CMP #0,TOS ; 1 test for TOS nonzero 182 0000F6 F423 JNZ PUSHTOS ; 2 183 0000F8 NODUP: NEXT ; 4 183.1 0000F8 3645 MOV @IP+,W // ; fetch word address into W 183.2 0000FA 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 183.3 0000FC ENDM 184 0000FC 185 0000FC ;C DROP x -- drop top of stack 186 0000FC HEADER DROP,4,'DROP',DOCODE 186.1 000000 PUBLIC DROP 186.2 0000FC .... DW link 186.3 0000FE FF DB 0FFh ; not immediate 186.4 0000FF link SET $ 186.5 0000FF 04 DB 4 186.6 000100 44524F50 DB 'DROP' 186.7 000104 EVEN 186.8 000104 IF 'DOCODE'='DOCODE' 186.9 000104 .... DROP: DW $+2 186.10 000106 ELSE 186.11 000106 DROP: DW DOCODE 186.12 000106 ENDIF 186.13 000106 ENDM 187 000106 3744 MOV @PSP+,TOS ; 2 188 000108 NEXT ; 4 188.1 000108 3645 MOV @IP+,W // ; fetch word address into W 188.2 00010A 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 188.3 00010C ENDM 189 00010C 190 00010C ;C SWAP x1 x2 -- x2 x1 swap top two items 191 00010C HEADER SWAP,4,'SWAP',DOCODE 191.1 000000 PUBLIC SWAP 191.2 00010C .... DW link 191.3 00010E FF DB 0FFh ; not immediate 191.4 00010F link SET $ 191.5 00010F 04 DB 4 191.6 000110 53574150 DB 'SWAP' 191.7 000114 EVEN 191.8 000114 IF 'DOCODE'='DOCODE' 191.9 000114 .... SWAP: DW $+2 191.10 000116 ELSE 191.11 000116 SWAP: DW DOCODE 191.12 000116 ENDIF 191.13 000116 ENDM 192 000116 2644 MOV @PSP,W ; 2 193 000118 84470000 MOV TOS,0(PSP) ; 4 194 00011C 0746 MOV W,TOS ; 1 195 00011E NEXT ; 4 195.1 00011E 3645 MOV @IP+,W // ; fetch word address into W 195.2 000120 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 195.3 000122 ENDM 196 000122 197 000122 ;C OVER x1 x2 -- x1 x2 x1 per stack diagram 198 000122 HEADER OVER,4,'OVER',DOCODE 198.1 000000 PUBLIC OVER 198.2 000122 .... DW link 198.3 000124 FF DB 0FFh ; not immediate 198.4 000125 link SET $ 198.5 000125 04 DB 4 198.6 000126 4F564552 DB 'OVER' 198.7 00012A EVEN 198.8 00012A IF 'DOCODE'='DOCODE' 198.9 00012A .... OVER: DW $+2 198.10 00012C ELSE 198.11 00012C OVER: DW DOCODE 198.12 00012C ENDIF 198.13 00012C ENDM 199 00012C 2644 MOV @PSP,W ; 2 200 00012E 2483 SUB #2,PSP ; 2 201 000130 84470000 MOV TOS,0(PSP) ; 4 202 000134 0746 MOV W,TOS ; 1 203 000136 NEXT ; 4 203.1 000136 3645 MOV @IP+,W // ; fetch word address into W 203.2 000138 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 203.3 00013A ENDM 204 00013A 205 00013A ;C ROT x1 x2 x3 -- x2 x3 x1 per stack diagram 206 00013A HEADER ROT,3,'ROT',DOCODE 206.1 000000 PUBLIC ROT 206.2 00013A .... DW link 206.3 00013C FF DB 0FFh ; not immediate 206.4 00013D link SET $ 206.5 00013D 03 DB 3 206.6 00013E 524F54 DB 'ROT' 206.7 000141 00 EVEN 206.8 000142 IF 'DOCODE'='DOCODE' 206.9 000142 .... ROT: DW $+2 206.10 000144 ELSE 206.11 000144 ROT: DW DOCODE 206.12 000144 ENDIF 206.13 000144 ENDM 207 000144 2644 MOV @PSP,W ; 2 fetch x2 208 000146 84470000 MOV TOS,0(PSP) ; 4 store x3 209 00014A 17440200 MOV 2(PSP),TOS ; 3 fetch x1 210 00014E 84460200 MOV W,2(PSP) ; 4 store x2 211 000152 NEXT ; 4 211.1 000152 3645 MOV @IP+,W // ; fetch word address into W 211.2 000154 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 211.3 000156 ENDM 212 000156 213 000156 ;X NIP x1 x2 -- x2 per stack diagram 214 000156 HEADER NIP,3,'NIP',DOCODE 214.1 000000 PUBLIC NIP 214.2 000156 .... DW link 214.3 000158 FF DB 0FFh ; not immediate 214.4 000159 link SET $ 214.5 000159 03 DB 3 214.6 00015A 4E4950 DB 'NIP' 214.7 00015D 00 EVEN 214.8 00015E IF 'DOCODE'='DOCODE' 214.9 00015E .... NIP: DW $+2 214.10 000160 ELSE 214.11 000160 NIP: DW DOCODE 214.12 000160 ENDIF 214.13 000160 ENDM 215 000160 2453 ADD #2,PSP ; 1 216 000162 NEXT ; 4 216.1 000162 3645 MOV @IP+,W // ; fetch word address into W 216.2 000164 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 216.3 000166 ENDM 217 000166 218 000166 ;C >R x -- R: -- x push to return stack 219 000166 HEADER TOR,2,'>R',DOCODE 219.1 000000 PUBLIC TOR 219.2 000166 .... DW link 219.3 000168 FF DB 0FFh ; not immediate 219.4 000169 link SET $ 219.5 000169 02 DB 2 219.6 00016A 3E52 DB '>R' 219.7 00016C EVEN 219.8 00016C IF 'DOCODE'='DOCODE' 219.9 00016C .... TOR: DW $+2 219.10 00016E ELSE 219.11 00016E TOR: DW DOCODE 219.12 00016E ENDIF 219.13 00016E ENDM 220 00016E 0712 PUSH TOS 221 000170 3744 MOV @PSP+,TOS 222 000172 NEXT 222.1 000172 3645 MOV @IP+,W // ; fetch word address into W 222.2 000174 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 222.3 000176 ENDM 223 000176 224 000176 ;C R> -- x R: x -- pop from return stack 225 000176 HEADER RFROM,2,'R>',DOCODE 225.1 000000 PUBLIC RFROM 225.2 000176 .... DW link 225.3 000178 FF DB 0FFh ; not immediate 225.4 000179 link SET $ 225.5 000179 02 DB 2 225.6 00017A 523E DB 'R>' 225.7 00017C EVEN 225.8 00017C IF 'DOCODE'='DOCODE' 225.9 00017C .... RFROM: DW $+2 225.10 00017E ELSE 225.11 00017E RFROM: DW DOCODE 225.12 00017E ENDIF 225.13 00017E ENDM 226 00017E 2483 SUB #2,PSP ; 2 227 000180 84470000 MOV TOS,0(PSP) ; 4 228 000184 3741 MOV @RSP+,TOS 229 000186 NEXT 229.1 000186 3645 MOV @IP+,W // ; fetch word address into W 229.2 000188 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 229.3 00018A ENDM 230 00018A 231 00018A ;C R@ -- x R: x -- x fetch from rtn stk 232 00018A HEADER RFETCH,2,'R@',DOCODE 232.1 000000 PUBLIC RFETCH 232.2 00018A .... DW link 232.3 00018C FF DB 0FFh ; not immediate 232.4 00018D link SET $ 232.5 00018D 02 DB 2 232.6 00018E 5240 DB 'R@' 232.7 000190 EVEN 232.8 000190 IF 'DOCODE'='DOCODE' 232.9 000190 .... RFETCH: DW $+2 232.10 000192 ELSE 232.11 000192 RFETCH: DW DOCODE 232.12 000192 ENDIF 232.13 000192 ENDM 233 000192 2483 SUB #2,PSP 234 000194 84470000 MOV TOS,0(PSP) 235 000198 2741 MOV @RSP,TOS 236 00019A NEXT 236.1 00019A 3645 MOV @IP+,W // ; fetch word address into W 236.2 00019C 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 236.3 00019E ENDM 237 00019E 238 00019E ;Z SP@ -- a-addr get data stack pointer 239 00019E HEADER SPFETCH,3,'SP@',DOCODE 239.1 000000 PUBLIC SPFETCH 239.2 00019E .... DW link 239.3 0001A0 FF DB 0FFh ; not immediate 239.4 0001A1 link SET $ 239.5 0001A1 03 DB 3 239.6 0001A2 535040 DB 'SP@' 239.7 0001A5 00 EVEN 239.8 0001A6 IF 'DOCODE'='DOCODE' 239.9 0001A6 .... SPFETCH: DW $+2 239.10 0001A8 ELSE 239.11 0001A8 SPFETCH: DW DOCODE 239.12 0001A8 ENDIF 239.13 0001A8 ENDM 240 0001A8 2483 SUB #2,PSP 241 0001AA 84470000 MOV TOS,0(PSP) 242 0001AE 0744 MOV PSP,TOS 243 0001B0 NEXT 243.1 0001B0 3645 MOV @IP+,W // ; fetch word address into W 243.2 0001B2 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 243.3 0001B4 ENDM 244 0001B4 245 0001B4 ;Z SP! a-addr -- set data stack pointer 246 0001B4 HEADER SPSTORE,3,'SP!',DOCODE 246.1 000000 PUBLIC SPSTORE 246.2 0001B4 .... DW link 246.3 0001B6 FF DB 0FFh ; not immediate 246.4 0001B7 link SET $ 246.5 0001B7 03 DB 3 246.6 0001B8 535021 DB 'SP!' 246.7 0001BB 00 EVEN 246.8 0001BC IF 'DOCODE'='DOCODE' 246.9 0001BC .... SPSTORE: DW $+2 246.10 0001BE ELSE 246.11 0001BE SPSTORE: DW DOCODE 246.12 0001BE ENDIF 246.13 0001BE ENDM 247 0001BE 0447 MOV TOS,PSP 248 0001C0 3744 MOV @PSP+,TOS ; 2 249 0001C2 NEXT 249.1 0001C2 3645 MOV @IP+,W // ; fetch word address into W 249.2 0001C4 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 249.3 0001C6 ENDM 250 0001C6 251 0001C6 ;Z RP@ -- a-addr get return stack pointer 252 0001C6 HEADER RPFETCH,3,'RP@',DOCODE 252.1 000000 PUBLIC RPFETCH 252.2 0001C6 .... DW link 252.3 0001C8 FF DB 0FFh ; not immediate 252.4 0001C9 link SET $ 252.5 0001C9 03 DB 3 252.6 0001CA 525040 DB 'RP@' 252.7 0001CD 00 EVEN 252.8 0001CE IF 'DOCODE'='DOCODE' 252.9 0001CE .... RPFETCH: DW $+2 252.10 0001D0 ELSE 252.11 0001D0 RPFETCH: DW DOCODE 252.12 0001D0 ENDIF 252.13 0001D0 ENDM 253 0001D0 2483 SUB #2,PSP 254 0001D2 84470000 MOV TOS,0(PSP) 255 0001D6 0741 MOV RSP,TOS 256 0001D8 NEXT 256.1 0001D8 3645 MOV @IP+,W // ; fetch word address into W 256.2 0001DA 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 256.3 0001DC ENDM 257 0001DC 258 0001DC ;Z RP! a-addr -- set return stack pointer 259 0001DC HEADER RPSTORE,3,'RP!',DOCODE 259.1 000000 PUBLIC RPSTORE 259.2 0001DC .... DW link 259.3 0001DE FF DB 0FFh ; not immediate 259.4 0001DF link SET $ 259.5 0001DF 03 DB 3 259.6 0001E0 525021 DB 'RP!' 259.7 0001E3 00 EVEN 259.8 0001E4 IF 'DOCODE'='DOCODE' 259.9 0001E4 .... RPSTORE: DW $+2 259.10 0001E6 ELSE 259.11 0001E6 RPSTORE: DW DOCODE 259.12 0001E6 ENDIF 259.13 0001E6 ENDM 260 0001E6 0147 MOV TOS,RSP 261 0001E8 3744 MOV @PSP+,TOS ; 2 262 0001EA NEXT 262.1 0001EA 3645 MOV @IP+,W // ; fetch word address into W 262.2 0001EC 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 262.3 0001EE ENDM 263 0001EE 264 0001EE ;X TUCK x1 x2 -- x2 x1 x2 per stack diagram 265 0001EE HEADER TUCK,4,'TUCK',DOCOLON 265.1 000000 PUBLIC TUCK 265.2 0001EE .... DW link 265.3 0001F0 FF DB 0FFh ; not immediate 265.4 0001F1 link SET $ 265.5 0001F1 04 DB 4 265.6 0001F2 5455434B DB 'TUCK' 265.7 0001F6 EVEN 265.8 0001F6 IF 'DOCOLON'='DOCODE' 265.9 0001F6 TUCK: DW $+2 265.10 0001F6 ELSE 265.11 0001F6 .... TUCK: DW DOCOLON 265.12 0001F8 ENDIF 265.13 0001F8 ENDM 266 0001F8 ............ DC16 SWAP,OVER,EXIT 267 0001FE 268 0001FE ; ---------------------------------------------- ------------------------ 269 0001FE ; MEMORY OPERATIONS 270 0001FE 271 0001FE ;C @ a-addr -- x fetch cell from memory 272 0001FE HEADER FETCH,1,'@',DOCODE 272.1 000000 PUBLIC FETCH 272.2 0001FE .... DW link 272.3 000200 FF DB 0FFh ; not immediate 272.4 000201 link SET $ 272.5 000201 01 DB 1 272.6 000202 40 DB '@' 272.7 000203 00 EVEN 272.8 000204 IF 'DOCODE'='DOCODE' 272.9 000204 .... FETCH: DW $+2 272.10 000206 ELSE 272.11 000206 FETCH: DW DOCODE 272.12 000206 ENDIF 272.13 000206 ENDM 273 000206 2747 MOV @TOS,TOS 274 000208 NEXT 274.1 000208 3645 MOV @IP+,W // ; fetch word address into W 274.2 00020A 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 274.3 00020C ENDM 275 00020C 276 00020C ;C ! x a-addr -- store cell in memory 277 00020C HEADER STORE,1,'!',DOCODE 277.1 000000 PUBLIC STORE 277.2 00020C .... DW link 277.3 00020E FF DB 0FFh ; not immediate 277.4 00020F link SET $ 277.5 00020F 01 DB 1 277.6 000210 21 DB '!' 277.7 000211 00 EVEN 277.8 000212 IF 'DOCODE'='DOCODE' 277.9 000212 .... STORE: DW $+2 277.10 000214 ELSE 277.11 000214 STORE: DW DOCODE 277.12 000214 ENDIF 277.13 000214 ENDM 278 000214 B7440000 MOV @PSP+,0(TOS) 279 000218 3744 MOV @PSP+,TOS 280 00021A NEXT 280.1 00021A 3645 MOV @IP+,W // ; fetch word address into W 280.2 00021C 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 280.3 00021E ENDM 281 00021E 282 00021E ;C C@ c-addr -- char fetch char from memory 283 00021E HEADER CFETCH,2,'C@',DOCODE 283.1 000000 PUBLIC CFETCH 283.2 00021E .... DW link 283.3 000220 FF DB 0FFh ; not immediate 283.4 000221 link SET $ 283.5 000221 02 DB 2 283.6 000222 4340 DB 'C@' 283.7 000224 EVEN 283.8 000224 IF 'DOCODE'='DOCODE' 283.9 000224 .... CFETCH: DW $+2 283.10 000226 ELSE 283.11 000226 CFETCH: DW DOCODE 283.12 000226 ENDIF 283.13 000226 ENDM 284 000226 6747 MOV.B @TOS,TOS 285 000228 NEXT 285.1 000228 3645 MOV @IP+,W // ; fetch word address into W 285.2 00022A 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 285.3 00022C ENDM 286 00022C 287 00022C ;C C! char c-addr -- store char in memory 288 00022C HEADER CSTORE,2,'C!',DOCODE 288.1 000000 PUBLIC CSTORE 288.2 00022C .... DW link 288.3 00022E FF DB 0FFh ; not immediate 288.4 00022F link SET $ 288.5 00022F 02 DB 2 288.6 000230 4321 DB 'C!' 288.7 000232 EVEN 288.8 000232 IF 'DOCODE'='DOCODE' 288.9 000232 .... CSTORE: DW $+2 288.10 000234 ELSE 288.11 000234 CSTORE: DW DOCODE 288.12 000234 ENDIF 288.13 000234 ENDM 289 000234 3644 MOV @PSP+,W 290 000236 C7460000 MOV.B W,0(TOS) 291 00023A 3744 MOV @PSP+,TOS 292 00023C NEXT 292.1 00023C 3645 MOV @IP+,W // ; fetch word address into W 292.2 00023E 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 292.3 000240 ENDM 293 000240 294 000240 ; FLASH MEMORY OPERATIONS 295 000240 ; Note that an I! or IC! to a RAM address >FLASHSTART will work -- it 296 000240 ; will enable the flash, write the RAM, and then disable the flash. 297 000240 ; An FLERASE to a RAM address will merely clear that one RAM cell. 298 000240 299 000240 ;Z FLERASE a-addr n -- erase n bytes of flash, full segment sizes. 300 000240 HEADER FLERASE,7,'FLERASE',DOCODE 300.1 000000 PUBLIC FLERASE 300.2 000240 .... DW link 300.3 000242 FF DB 0FFh ; not immediate 300.4 000243 link SET $ 300.5 000243 07 DB 7 300.6 000244 464C45524153* DB 'FLERASE' 300.7 00024B 00 EVEN 300.8 00024C IF 'DOCODE'='DOCODE' 300.9 00024C .... FLERASE: DW $+2 300.10 00024E ELSE 300.11 00024E FLERASE: DW DOCODE 300.12 00024E ENDIF 300.13 00024E ENDM 301 00024E 3644 MOV @PSP+,W ; get address in W 302 000250 0756 ADD W,TOS ; TOS=end adrs (first unerased adrs) 303 000252 FLE_1: 304 000252 0697 CMP TOS,W ; adr-end 305 000254 272C JC FLE_X ; if no borrow, adr>=end, do not erase 306 000256 ; is it within Main flash? 307 000256 369000C0 CMP #FLASHSTART,W ; flash start 308 00025A 0328 JNC FLE_INFO ; if borrow, adrend, check if Info 311 000262 FLE_INFO: ; is it within Info flash? 312 000262 36900010 CMP #INFOSTART,W 313 000266 1E28 JNC FLE_X ; if borrow, adrend, do not erase 316 00026E FLE_OK: ; Address is either in Main flash, or in Info flash. 317 00026E ; Segment Erase from flash. 318 00026E ; Assumes ACCVIE = NMIIE = OFIE = 0, watchdog disabled. 319 00026E ; Per section 5.3.2 of MSP430 Family User's Guide 320 00026E 32C2 DINT ; Disable interrupts 321 000270 B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear LOCK 322 000276 B24002A52801 MOV #FWKEY+ERASE,&FCTL1 ; Enable segment erase 323 00027C B6430000 MOV #-1,0(W) ; Dummy write in segment to erase 324 000280 B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear erase command. 325 000286 B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Done, set LOCK 326 00028C 32D2 EINT ; Enable interrupts 327 00028E ; Advance flash pointer by 512 bytes or 128 bytes 328 00028E ; is it within Main flash? 329 00028E 369000C0 CMP #FLASHSTART,W 330 000292 0528 JNC FL_INFO ; if borrow, adrend, must be Info 333 00029A 36508001 ADD #(MAINSEG-INFOSEG),W 334 00029E 36508000 FL_INFO: ADD #INFOSEG,W 335 0002A2 D73F JMP FLE_1 ; continue till past end or outside limits 336 0002A4 3744 FLE_X: MOV @PSP+,TOS 337 0002A6 NEXT 337.1 0002A6 3645 MOV @IP+,W // ; fetch word address into W 337.2 0002A8 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 337.3 0002AA ENDM 338 0002AA 339 0002AA ; Program Space (Flash) operators 340 0002AA 341 0002AA ;Z I! x a-addr -- store cell in Instruction memory 342 0002AA HEADER ISTORE,2,'I!',DOCODE 342.1 000000 PUBLIC ISTORE 342.2 0002AA .... DW link 342.3 0002AC FF DB 0FFh ; not immediate 342.4 0002AD link SET $ 342.5 0002AD 02 DB 2 342.6 0002AE 4921 DB 'I!' 342.7 0002B0 EVEN 342.8 0002B0 IF 'DOCODE'='DOCODE' 342.9 0002B0 .... ISTORE: DW $+2 342.10 0002B2 ELSE 342.11 0002B2 ISTORE: DW DOCODE 342.12 0002B2 ENDIF 342.13 0002B2 ENDM 343 0002B2 3644 MOV @PSP+,W ; get data to write 344 0002B4 17B3 BIT #1,TOS 345 0002B6 1E20 JNZ IST_X ; if not even address, do not write 346 0002B8 2697 CMP @TOS,W 347 0002BA 1C24 JZ IST_X ; if memory is desired value, do not write 348 0002BC ; is it within Main flash? 349 0002BC 379000C0 CMP #FLASHSTART,TOS 350 0002C0 0328 JNC IST_INFO ; if borrow, adrend, check if Info 353 0002C8 IST_INFO: ; is it within Info flash? 354 0002C8 37900010 CMP #INFOSTART,TOS 355 0002CC 0A28 JNC IST_RAM ; if borrow, adrend, assume it's RAM 358 0002D4 IST_OK: ; Address is either in Main flash, or in Info flash. 359 0002D4 ; Byte/word write from flash. 360 0002D4 ; Assumes location to write is already erased 361 0002D4 ; Assumes ACCVIE = NMIIE = OFIE = 0, watchdog disabled. 362 0002D4 ; Per section 5.3.3 of MSP430 Family User's Guide 363 0002D4 32C2 DINT ; Disable interrupts 364 0002D6 B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear LOCK 365 0002DC B24040A52801 MOV #FWKEY+WRT,&FCTL1 ; Enable write 366 0002E2 IST_RAM: ; If RAM, jump here to write. FCTL1,FCTL3,EINT are superfluous 367 0002E2 87460000 MOV W,0(TOS) ; Write word to flash location 368 0002E6 B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear WRT. 369 0002EC B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Set LOCK 370 0002F2 32D2 EINT ; Enable interrupts 371 0002F4 3744 IST_X: MOV @PSP+,TOS ; pop new TOS 372 0002F6 NEXT 372.1 0002F6 3645 MOV @IP+,W // ; fetch word address into W 372.2 0002F8 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 372.3 0002FA ENDM 373 0002FA 374 0002FA ;Z IC! x a-addr -- store char in Instruction memory 375 0002FA HEADER ICSTORE,3,'IC!',DOCODE 375.1 000000 PUBLIC ICSTORE 375.2 0002FA .... DW link 375.3 0002FC FF DB 0FFh ; not immediate 375.4 0002FD link SET $ 375.5 0002FD 03 DB 3 375.6 0002FE 494321 DB 'IC!' 375.7 000301 00 EVEN 375.8 000302 IF 'DOCODE'='DOCODE' 375.9 000302 .... ICSTORE: DW $+2 375.10 000304 ELSE 375.11 000304 ICSTORE: DW DOCODE 375.12 000304 ENDIF 375.13 000304 ENDM 376 000304 3644 MOV @PSP+,W ; get data to write 377 000306 6697 CMP.B @TOS,W 378 000308 F527 JZ IST_X ; if memory is desired value, do not write 379 00030A ; is it within Main flash? 380 00030A 379000C0 CMP #FLASHSTART,TOS 381 00030E 0328 JNC ICST_INFO ; if borrow, adrend, check if Info 384 000316 ICST_INFO: ; is it within Info flash? 385 000316 37900010 CMP #INFOSTART,TOS 386 00031A 0A28 JNC ICST_RAM ; if borrow, adrend, assume it's RAM 389 000322 ICST_OK: ; Address is either in Main flash, or in Info flash. 390 000322 ; Byte/word write from flash. 391 000322 ; Assumes location to write is already erased 392 000322 ; Assumes ACCVIE = NMIIE = OFIE = 0, watchdog disabled. 393 000322 ; Per section 5.3.3 of MSP430 Family User's Guide 394 000322 32C2 DINT ; Disable interrupts 395 000324 B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear LOCK 396 00032A B24040A52801 MOV #FWKEY+WRT,&FCTL1 ; Enable write 397 000330 ICST_RAM: ; If RAM, jump here to write. FCTL1,FCTL3,EINT are superfluous 398 000330 C7460000 MOV.B W,0(TOS) ; Write byte to flash location 399 000334 B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear WRT. 400 00033A B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Set LOCK 401 000340 32D2 EINT ; Enable interrupts 402 000342 D83F JMP IST_X 403 000344 404 000344 /* 405 000344 ;Z I@ a-addr -- x fetch cell from Instruction memory 406 000344 HEADER IFETCH,2,'I@',FETCH+2 407 000344 408 000344 ;Z IC@ a-addr -- x fetch char from Instruction memory 409 000344 HEADER ICFETCH,3,'IC@',CFETCH+2 410 000344 */ 411 000344 #define IFETCH FETCH 412 000344 #define ICFETCH CFETCH 413 000344 414 000344 415 000344 416 000344 ;Z D->I c-addr1 c-addr2 u -- move Data->Code 417 000344 ; Block move from Data space to Code space. Flashable. 418 000344 ; For the MSP430, this uses a "smart" algorithm that uses word writes, 419 000344 ; rather than byte writes, whenever possible. Note that byte reads 420 000344 ; are used for the source, so it need not be aligned. 421 000344 HEADER DTOI,4,'D->I',DOCODE 421.1 000000 PUBLIC DTOI 421.2 000344 .... DW link 421.3 000346 FF DB 0FFh ; not immediate 421.4 000347 link SET $ 421.5 000347 04 DB 4 421.6 000348 442D3E49 DB 'D->I' 421.7 00034C EVEN 421.8 00034C IF 'DOCODE'='DOCODE' 421.9 00034C .... DTOI: DW $+2 421.10 00034E ELSE 421.11 00034E DTOI: DW DOCODE 421.12 00034E ENDIF 421.13 00034E ENDM 422 00034E 3644 MOV @PSP+,W ; dest adrs 423 000350 3A44 MOV @PSP+,X ; src adrs 424 000352 0793 CMP #0,TOS 425 000354 2024 JZ DTOI_X 426 000356 DTOI_LOOP: ; Begin flash write sequence 427 000356 32C2 DINT ; Disable interrupts 428 000358 B24000A52C01 MOV #FWKEY,&FCTL3 ; Clear LOCK 429 00035E B24040A52801 MOV #FWKEY+WRT,&FCTL1 ; Enable write 430 000364 ; If length is 1, or dest. address is odd, do a byte write. 431 000364 ; Else, do a word write. 432 000364 1793 CMP #1,TOS 433 000366 0B24 JZ DTOI_BYTE 434 000368 16B3 BIT #1,W 435 00036A 0920 JNZ DTOI_BYTE 436 00036C 7B4A DTOI_WORD: MOV.B @X+,Y ; get low byte of word 437 00036E 7C4A MOV.B @X+,Q ; get high byte of word 438 000370 8C10 SWPB Q 439 000372 0BDC BIS Q,Y ; merge bytes 440 000374 864B0000 MOV.W Y,0(W) ; write byte to dest 441 000378 2653 ADD #2,W 442 00037A 1783 SUB #1,TOS ; another 1 will be subtracted below 443 00037C 033C JMP DTOI_END 444 00037E F64A0000 DTOI_BYTE: MOV.B @X+,0(W) ; copy byte from src to dest 445 000382 1653 ADD #1,W 446 000384 DTOI_END: ; End flash write sequence 447 000384 B24000A52801 MOV #FWKEY,&FCTL1 ; Done. Clear WRT. 448 00038A B24010A52C01 MOV #FWKEY+LOCK,&FCTL3 ; Set LOCK 449 000390 32D2 EINT ; Enable interrupts 450 000392 1783 SUB #1,TOS 451 000394 E023 JNZ DTOI_LOOP 452 000396 3744 DTOI_X: MOV @PSP+,TOS ; pop new TOS 453 000398 NEXT 453.1 000398 3645 MOV @IP+,W // ; fetch word address into W 453.2 00039A 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 453.3 00039C ENDM 454 00039C 455 00039C ; ---------------------------------------------- ------------------------ 456 00039C ; ARITHMETIC OPERATIONS 457 00039C 458 00039C ;C + n1/u1 n2/u2 -- n3/u3 add n1+n2 459 00039C HEADER PLUS,1,'+',DOCODE 459.1 000000 PUBLIC PLUS 459.2 00039C .... DW link 459.3 00039E FF DB 0FFh ; not immediate 459.4 00039F link SET $ 459.5 00039F 01 DB 1 459.6 0003A0 2B DB '+' 459.7 0003A1 00 EVEN 459.8 0003A2 IF 'DOCODE'='DOCODE' 459.9 0003A2 .... PLUS: DW $+2 459.10 0003A4 ELSE 459.11 0003A4 PLUS: DW DOCODE 459.12 0003A4 ENDIF 459.13 0003A4 ENDM 460 0003A4 3754 ADD @PSP+,TOS 461 0003A6 NEXT 461.1 0003A6 3645 MOV @IP+,W // ; fetch word address into W 461.2 0003A8 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 461.3 0003AA ENDM 462 0003AA 463 0003AA ;C +! n/u a-addr -- add cell to memory 464 0003AA HEADER PLUSSTORE,2,'+!',DOCODE 464.1 000000 PUBLIC PLUSSTORE 464.2 0003AA .... DW link 464.3 0003AC FF DB 0FFh ; not immediate 464.4 0003AD link SET $ 464.5 0003AD 02 DB 2 464.6 0003AE 2B21 DB '+!' 464.7 0003B0 EVEN 464.8 0003B0 IF 'DOCODE'='DOCODE' 464.9 0003B0 .... PLUSSTORE: DW $+2 464.10 0003B2 ELSE 464.11 0003B2 PLUSSTORE: DW DOCODE 464.12 0003B2 ENDIF 464.13 0003B2 ENDM 465 0003B2 B7540000 ADD @PSP+,0(TOS) 466 0003B6 3744 MOV @PSP+,TOS 467 0003B8 NEXT 467.1 0003B8 3645 MOV @IP+,W // ; fetch word address into W 467.2 0003BA 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 467.3 0003BC ENDM 468 0003BC 469 0003BC ;X M+ d n -- d add single to double 470 0003BC HEADER MPLUS,2,'M+',DOCODE 470.1 000000 PUBLIC MPLUS 470.2 0003BC .... DW link 470.3 0003BE FF DB 0FFh ; not immediate 470.4 0003BF link SET $ 470.5 0003BF 02 DB 2 470.6 0003C0 4D2B DB 'M+' 470.7 0003C2 EVEN 470.8 0003C2 IF 'DOCODE'='DOCODE' 470.9 0003C2 .... MPLUS: DW $+2 470.10 0003C4 ELSE 470.11 0003C4 MPLUS: DW DOCODE 470.12 0003C4 ENDIF 470.13 0003C4 ENDM 471 0003C4 84570200 ADD TOS,2(PSP) 472 0003C8 84630000 ADDC #0,0(PSP) 473 0003CC 3744 MOV @PSP+,TOS 474 0003CE NEXT 474.1 0003CE 3645 MOV @IP+,W // ; fetch word address into W 474.2 0003D0 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 474.3 0003D2 ENDM 475 0003D2 476 0003D2 ;C - n1/u1 n2/u2 -- n3/u3 subtract n1-n2 477 0003D2 HEADER MINUS,1,'-',DOCODE 477.1 000000 PUBLIC MINUS 477.2 0003D2 .... DW link 477.3 0003D4 FF DB 0FFh ; not immediate 477.4 0003D5 link SET $ 477.5 0003D5 01 DB 1 477.6 0003D6 2D DB '-' 477.7 0003D7 00 EVEN 477.8 0003D8 IF 'DOCODE'='DOCODE' 477.9 0003D8 .... MINUS: DW $+2 477.10 0003DA ELSE 477.11 0003DA MINUS: DW DOCODE 477.12 0003DA ENDIF 477.13 0003DA ENDM 478 0003DA 3644 MOV @PSP+,W 479 0003DC 0687 SUB TOS,W 480 0003DE 0746 MOV W,TOS 481 0003E0 NEXT 481.1 0003E0 3645 MOV @IP+,W // ; fetch word address into W 481.2 0003E2 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 481.3 0003E4 ENDM 482 0003E4 483 0003E4 ;C AND x1 x2 -- x3 logical AND 484 0003E4 HEADER ANDD,3,'AND',DOCODE 484.1 000000 PUBLIC ANDD 484.2 0003E4 .... DW link 484.3 0003E6 FF DB 0FFh ; not immediate 484.4 0003E7 link SET $ 484.5 0003E7 03 DB 3 484.6 0003E8 414E44 DB 'AND' 484.7 0003EB 00 EVEN 484.8 0003EC IF 'DOCODE'='DOCODE' 484.9 0003EC .... ANDD: DW $+2 484.10 0003EE ELSE 484.11 0003EE ANDD: DW DOCODE 484.12 0003EE ENDIF 484.13 0003EE ENDM 485 0003EE 37F4 AND @PSP+,TOS 486 0003F0 NEXT 486.1 0003F0 3645 MOV @IP+,W // ; fetch word address into W 486.2 0003F2 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 486.3 0003F4 ENDM 487 0003F4 488 0003F4 ;C OR x1 x2 -- x3 logical OR 489 0003F4 HEADER ORR,2,'OR',DOCODE 489.1 000000 PUBLIC ORR 489.2 0003F4 .... DW link 489.3 0003F6 FF DB 0FFh ; not immediate 489.4 0003F7 link SET $ 489.5 0003F7 02 DB 2 489.6 0003F8 4F52 DB 'OR' 489.7 0003FA EVEN 489.8 0003FA IF 'DOCODE'='DOCODE' 489.9 0003FA .... ORR: DW $+2 489.10 0003FC ELSE 489.11 0003FC ORR: DW DOCODE 489.12 0003FC ENDIF 489.13 0003FC ENDM 490 0003FC 37D4 BIS @PSP+,TOS 491 0003FE NEXT 491.1 0003FE 3645 MOV @IP+,W // ; fetch word address into W 491.2 000400 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 491.3 000402 ENDM 492 000402 493 000402 ;C XOR x1 x2 -- x3 logical XOR 494 000402 HEADER XORR,3,'XOR',DOCODE 494.1 000000 PUBLIC XORR 494.2 000402 .... DW link 494.3 000404 FF DB 0FFh ; not immediate 494.4 000405 link SET $ 494.5 000405 03 DB 3 494.6 000406 584F52 DB 'XOR' 494.7 000409 00 EVEN 494.8 00040A IF 'DOCODE'='DOCODE' 494.9 00040A .... XORR: DW $+2 494.10 00040C ELSE 494.11 00040C XORR: DW DOCODE 494.12 00040C ENDIF 494.13 00040C ENDM 495 00040C 37E4 XOR @PSP+,TOS 496 00040E NEXT 496.1 00040E 3645 MOV @IP+,W // ; fetch word address into W 496.2 000410 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 496.3 000412 ENDM 497 000412 498 000412 ;C INVERT x1 -- x2 bitwise inversion 499 000412 HEADER INVERT,6,'INVERT',DOCODE 499.1 000000 PUBLIC INVERT 499.2 000412 .... DW link 499.3 000414 FF DB 0FFh ; not immediate 499.4 000415 link SET $ 499.5 000415 06 DB 6 499.6 000416 494E56455254 DB 'INVERT' 499.7 00041C EVEN 499.8 00041C IF 'DOCODE'='DOCODE' 499.9 00041C .... INVERT: DW $+2 499.10 00041E ELSE 499.11 00041E INVERT: DW DOCODE 499.12 00041E ENDIF 499.13 00041E ENDM 500 00041E 37E3 XOR #-1,TOS 501 000420 NEXT 501.1 000420 3645 MOV @IP+,W // ; fetch word address into W 501.2 000422 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 501.3 000424 ENDM 502 000424 503 000424 ;C NEGATE x1 -- x2 two's complement 504 000424 HEADER NEGATE,6,'NEGATE',DOCODE 504.1 000000 PUBLIC NEGATE 504.2 000424 .... DW link 504.3 000426 FF DB 0FFh ; not immediate 504.4 000427 link SET $ 504.5 000427 06 DB 6 504.6 000428 4E4547415445 DB 'NEGATE' 504.7 00042E EVEN 504.8 00042E IF 'DOCODE'='DOCODE' 504.9 00042E .... NEGATE: DW $+2 504.10 000430 ELSE 504.11 000430 NEGATE: DW DOCODE 504.12 000430 ENDIF 504.13 000430 ENDM 505 000430 37E3 XOR #-1,TOS 506 000432 1753 ADD #1,TOS 507 000434 NEXT 507.1 000434 3645 MOV @IP+,W // ; fetch word address into W 507.2 000436 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 507.3 000438 ENDM 508 000438 509 000438 ;C 1+ n1/u1 -- n2/u2 add 1 to TOS 510 000438 HEADER ONEPLUS,2,'1+',DOCODE 510.1 000000 PUBLIC ONEPLUS 510.2 000438 .... DW link 510.3 00043A FF DB 0FFh ; not immediate 510.4 00043B link SET $ 510.5 00043B 02 DB 2 510.6 00043C 312B DB '1+' 510.7 00043E EVEN 510.8 00043E IF 'DOCODE'='DOCODE' 510.9 00043E .... ONEPLUS: DW $+2 510.10 000440 ELSE 510.11 000440 ONEPLUS: DW DOCODE 510.12 000440 ENDIF 510.13 000440 ENDM 511 000440 1753 ADD #1,TOS 512 000442 NEXT 512.1 000442 3645 MOV @IP+,W // ; fetch word address into W 512.2 000444 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 512.3 000446 ENDM 513 000446 514 000446 ;C 1- n1/u1 -- n2/u2 subtract 1 from TOS 515 000446 HEADER ONEMINUS,2,'1-',DOCODE 515.1 000000 PUBLIC ONEMINUS 515.2 000446 .... DW link 515.3 000448 FF DB 0FFh ; not immediate 515.4 000449 link SET $ 515.5 000449 02 DB 2 515.6 00044A 312D DB '1-' 515.7 00044C EVEN 515.8 00044C IF 'DOCODE'='DOCODE' 515.9 00044C .... ONEMINUS: DW $+2 515.10 00044E ELSE 515.11 00044E ONEMINUS: DW DOCODE 515.12 00044E ENDIF 515.13 00044E ENDM 516 00044E 1783 SUB #1,TOS 517 000450 NEXT 517.1 000450 3645 MOV @IP+,W // ; fetch word address into W 517.2 000452 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 517.3 000454 ENDM 518 000454 519 000454 ;Z >< x1 -- x2 swap bytes (not ANSI) 520 000454 HEADER SWAPBYTES,2,'><',DOCODE 520.1 000000 PUBLIC SWAPBYTES 520.2 000454 .... DW link 520.3 000456 FF DB 0FFh ; not immediate 520.4 000457 link SET $ 520.5 000457 02 DB 2 520.6 000458 3E3C DB '><' 520.7 00045A EVEN 520.8 00045A IF 'DOCODE'='DOCODE' 520.9 00045A .... SWAPBYTES: DW $+2 520.10 00045C ELSE 520.11 00045C SWAPBYTES: DW DOCODE 520.12 00045C ENDIF 520.13 00045C ENDM 521 00045C 8710 SWPB TOS 522 00045E NEXT 522.1 00045E 3645 MOV @IP+,W // ; fetch word address into W 522.2 000460 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 522.3 000462 ENDM 523 000462 524 000462 ;C 2* x1 -- x2 arithmetic left shift 525 000462 HEADER TWOSTAR,2,'2*',DOCODE 525.1 000000 PUBLIC TWOSTAR 525.2 000462 .... DW link 525.3 000464 FF DB 0FFh ; not immediate 525.4 000465 link SET $ 525.5 000465 02 DB 2 525.6 000466 322A DB '2*' 525.7 000468 EVEN 525.8 000468 IF 'DOCODE'='DOCODE' 525.9 000468 .... TWOSTAR: DW $+2 525.10 00046A ELSE 525.11 00046A TWOSTAR: DW DOCODE 525.12 00046A ENDIF 525.13 00046A ENDM 526 00046A 0757 ADD TOS,TOS 527 00046C NEXT 527.1 00046C 3645 MOV @IP+,W // ; fetch word address into W 527.2 00046E 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 527.3 000470 ENDM 528 000470 529 000470 ;C 2/ x1 -- x2 arithmetic right shift 530 000470 HEADER TWOSLASH,2,'2/',DOCODE 530.1 000000 PUBLIC TWOSLASH 530.2 000470 .... DW link 530.3 000472 FF DB 0FFh ; not immediate 530.4 000473 link SET $ 530.5 000473 02 DB 2 530.6 000474 322F DB '2/' 530.7 000476 EVEN 530.8 000476 IF 'DOCODE'='DOCODE' 530.9 000476 .... TWOSLASH: DW $+2 530.10 000478 ELSE 530.11 000478 TWOSLASH: DW DOCODE 530.12 000478 ENDIF 530.13 000478 ENDM 531 000478 0711 RRA TOS 532 00047A NEXT 532.1 00047A 3645 MOV @IP+,W // ; fetch word address into W 532.2 00047C 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 532.3 00047E ENDM 533 00047E 534 00047E ;C LSHIFT x1 u -- x2 logical L shift u places 535 00047E HEADER LSHIFT,6,'LSHIFT',DOCODE 535.1 000000 PUBLIC LSHIFT 535.2 00047E .... DW link 535.3 000480 FF DB 0FFh ; not immediate 535.4 000481 link SET $ 535.5 000481 06 DB 6 535.6 000482 4C5348494654 DB 'LSHIFT' 535.7 000488 EVEN 535.8 000488 IF 'DOCODE'='DOCODE' 535.9 000488 .... LSHIFT: DW $+2 535.10 00048A ELSE 535.11 00048A LSHIFT: DW DOCODE 535.12 00048A ENDIF 535.13 00048A ENDM 536 00048A 3644 MOV @PSP+,W 537 00048C 37F01F00 AND #1Fh,TOS ; no need to shift more than 16 538 000490 0324 JZ LSH_X 539 000492 0656 LSH_1: ADD W,W 540 000494 1783 SUB #1,TOS 541 000496 FD23 JNZ LSH_1 542 000498 0746 LSH_X: MOV W,TOS 543 00049A NEXT 543.1 00049A 3645 MOV @IP+,W // ; fetch word address into W 543.2 00049C 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 543.3 00049E ENDM 544 00049E 545 00049E ;C RSHIFT x1 u -- x2 logical R shift u places 546 00049E HEADER RSHIFT,6,'RSHIFT',DOCODE 546.1 000000 PUBLIC RSHIFT 546.2 00049E .... DW link 546.3 0004A0 FF DB 0FFh ; not immediate 546.4 0004A1 link SET $ 546.5 0004A1 06 DB 6 546.6 0004A2 525348494654 DB 'RSHIFT' 546.7 0004A8 EVEN 546.8 0004A8 IF 'DOCODE'='DOCODE' 546.9 0004A8 .... RSHIFT: DW $+2 546.10 0004AA ELSE 546.11 0004AA RSHIFT: DW DOCODE 546.12 0004AA ENDIF 546.13 0004AA ENDM 547 0004AA 3644 MOV @PSP+,W 548 0004AC 37F01F00 AND #1Fh,TOS ; no need to shift more than 16 549 0004B0 0424 JZ RSH_X 550 0004B2 12C3 RSH_1: CLRC 551 0004B4 0610 RRC W 552 0004B6 1783 SUB #1,TOS 553 0004B8 FC23 JNZ RSH_1 554 0004BA 0746 RSH_X: MOV W,TOS 555 0004BC NEXT 555.1 0004BC 3645 MOV @IP+,W // ; fetch word address into W 555.2 0004BE 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 555.3 0004C0 ENDM 556 0004C0 557 0004C0 ; ---------------------------------------------- ------------------------ 558 0004C0 ; COMPARISON OPERATIONS 559 0004C0 560 0004C0 ;C 0= n/u -- flag return true if TOS=0 561 0004C0 HEADER ZEROEQUAL,2,'0=',DOCODE 561.1 000000 PUBLIC ZEROEQUAL 561.2 0004C0 .... DW link 561.3 0004C2 FF DB 0FFh ; not immediate 561.4 0004C3 link SET $ 561.5 0004C3 02 DB 2 561.6 0004C4 303D DB '0=' 561.7 0004C6 EVEN 561.8 0004C6 IF 'DOCODE'='DOCODE' 561.9 0004C6 .... ZEROEQUAL: DW $+2 561.10 0004C8 ELSE 561.11 0004C8 ZEROEQUAL: DW DOCODE 561.12 0004C8 ENDIF 561.13 0004C8 ENDM 562 0004C8 1783 SUB #1,TOS ; borrow (clear cy) if TOS was 0 563 0004CA 0777 SUBC TOS,TOS ; TOS=-1 if borrow was set 564 0004CC NEXT 564.1 0004CC 3645 MOV @IP+,W // ; fetch word address into W 564.2 0004CE 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 564.3 0004D0 ENDM 565 0004D0 566 0004D0 ;C 0< n -- flag true if TOS negative 567 0004D0 HEADER ZEROLESS,2,'0<',DOCODE 567.1 000000 PUBLIC ZEROLESS 567.2 0004D0 .... DW link 567.3 0004D2 FF DB 0FFh ; not immediate 567.4 0004D3 link SET $ 567.5 0004D3 02 DB 2 567.6 0004D4 303C DB '0<' 567.7 0004D6 EVEN 567.8 0004D6 IF 'DOCODE'='DOCODE' 567.9 0004D6 .... ZEROLESS: DW $+2 567.10 0004D8 ELSE 567.11 0004D8 ZEROLESS: DW DOCODE 567.12 0004D8 ENDIF 567.13 0004D8 ENDM 568 0004D8 0757 ADD TOS,TOS ; set cy if TOS negative 569 0004DA 0777 SUBC TOS,TOS ; TOS=-1 if carry was clear 570 0004DC 37E3 XOR #-1,TOS ; TOS=-1 if carry was set 571 0004DE NEXT 571.1 0004DE 3645 MOV @IP+,W // ; fetch word address into W 571.2 0004E0 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 571.3 0004E2 ENDM 572 0004E2 573 0004E2 ;C = x1 x2 -- flag test x1=x2 574 0004E2 HEADER EQUAL,1,'=',DOCODE 574.1 000000 PUBLIC EQUAL 574.2 0004E2 .... DW link 574.3 0004E4 FF DB 0FFh ; not immediate 574.4 0004E5 link SET $ 574.5 0004E5 01 DB 1 574.6 0004E6 3D DB '=' 574.7 0004E7 00 EVEN 574.8 0004E8 IF 'DOCODE'='DOCODE' 574.9 0004E8 .... EQUAL: DW $+2 574.10 0004EA ELSE 574.11 0004EA EQUAL: DW DOCODE 574.12 0004EA ENDIF 574.13 0004EA ENDM 575 0004EA 3644 MOV @PSP+,W 576 0004EC 0687 SUB TOS,W ; x1-x2 in W, flags set 577 0004EE 1124 JZ TOSTRUE 578 0004F0 0743 TOSFALSE: MOV #0,TOS 579 0004F2 NEXT 579.1 0004F2 3645 MOV @IP+,W // ; fetch word address into W 579.2 0004F4 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 579.3 0004F6 ENDM 580 0004F6 581 0004F6 ;X <> x1 x2 -- flag test not eq (not ANSI) 582 0004F6 HEADER NOTEQUAL,2,'<>',DOCOLON 582.1 000000 PUBLIC NOTEQUAL 582.2 0004F6 .... DW link 582.3 0004F8 FF DB 0FFh ; not immediate 582.4 0004F9 link SET $ 582.5 0004F9 02 DB 2 582.6 0004FA 3C3E DB '<>' 582.7 0004FC EVEN 582.8 0004FC IF 'DOCOLON'='DOCODE' 582.9 0004FC NOTEQUAL: DW $+2 582.10 0004FC ELSE 582.11 0004FC .... NOTEQUAL: DW DOCOLON 582.12 0004FE ENDIF 582.13 0004FE ENDM 583 0004FE ............ DW EQUAL,ZEROEQUAL,EXIT 584 000504 585 000504 ;C < n1 n2 -- flag test n1 n1 n2 -- flag test n1>n2, signed 594 000518 HEADER GREATER,1,'>',DOCOLON 594.1 000000 PUBLIC GREATER 594.2 000518 .... DW link 594.3 00051A FF DB 0FFh ; not immediate 594.4 00051B link SET $ 594.5 00051B 01 DB 1 594.6 00051C 3E DB '>' 594.7 00051D 00 EVEN 594.8 00051E IF 'DOCOLON'='DOCODE' 594.9 00051E GREATER: DW $+2 594.10 00051E ELSE 594.11 00051E .... GREATER: DW DOCOLON 594.12 000520 ENDIF 594.13 000520 ENDM 595 000520 ............ DW SWAP,LESS,EXIT 596 000526 597 000526 ;C U< u1 u2 -- flag test u1 u1 u2 -- flag u1>u2 unsgd (not ANSI) 605 000536 HEADER UGREATER,2,'U>',DOCOLON 605.1 000000 PUBLIC UGREATER 605.2 000536 .... DW link 605.3 000538 FF DB 0FFh ; not immediate 605.4 000539 link SET $ 605.5 000539 02 DB 2 605.6 00053A 553E DB 'U>' 605.7 00053C EVEN 605.8 00053C IF 'DOCOLON'='DOCODE' 605.9 00053C UGREATER: DW $+2 605.10 00053C ELSE 605.11 00053C .... UGREATER: DW DOCOLON 605.12 00053E ENDIF 605.13 00053E ENDM 606 00053E ............ DW SWAP,ULESS,EXIT 607 000544 608 000544 ; ---------------------------------------------- ------------------------ 609 000544 ; LOOP AND BRANCH OPERATIONS 610 000544 ; These use relative branch addresses: a branch is ADD @IP,IP 611 000544 612 000544 ;Z branch -- branch always 613 000544 HEADER bran,6,'branch',DOCODE 613.1 000000 PUBLIC bran 613.2 000544 .... DW link 613.3 000546 FF DB 0FFh ; not immediate 613.4 000547 link SET $ 613.5 000547 06 DB 6 613.6 000548 6272616E6368 DB 'branch' 613.7 00054E EVEN 613.8 00054E IF 'DOCODE'='DOCODE' 613.9 00054E .... bran: DW $+2 613.10 000550 ELSE 613.11 000550 bran: DW DOCODE 613.12 000550 ENDIF 613.13 000550 ENDM 614 000550 2555 dobran: ADD @IP,IP ; 2 615 000552 NEXT ; 4 615.1 000552 3645 MOV @IP+,W // ; fetch word address into W 615.2 000554 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 615.3 000556 ENDM 616 000556 617 000556 ;Z ?branch x -- branch if TOS zero 618 000556 HEADER qbran,7,'?branch',DOCODE 618.1 000000 PUBLIC qbran 618.2 000556 .... DW link 618.3 000558 FF DB 0FFh ; not immediate 618.4 000559 link SET $ 618.5 000559 07 DB 7 618.6 00055A 3F6272616E63* DB '?branch' 618.7 000561 00 EVEN 618.8 000562 IF 'DOCODE'='DOCODE' 618.9 000562 .... qbran: DW $+2 618.10 000564 ELSE 618.11 000564 qbran: DW DOCODE 618.12 000564 ENDIF 618.13 000564 ENDM 619 000564 0753 ADD #0,TOS ; 1 test TOS value 620 000566 3744 MOV @PSP+,TOS ; 2 pop new TOS value (doesn't change flags) 621 000568 F327 JZ dobran ; 2 if TOS was zero, take the branch 622 00056A 2553 ADD #2,IP ; 1 else skip the branch destination 623 00056C NEXT ; 4 623.1 00056C 3645 MOV @IP+,W // ; fetch word address into W 623.2 00056E 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 623.3 000570 ENDM 624 000570 625 000570 ;Z (do) n1|u1 n2|u2 -- R: -- sys1 sys2 run-time code for DO 626 000570 ; '83 and ANSI standard loops terminate when the boundary of 627 000570 ; limit-1 and limit is crossed, in either direction. This can 628 000570 ; be conveniently implemented by making the limit 8000h, so that 629 000570 ; arithmetic overflow logic can detect crossing. I learned this 630 000570 ; trick from Laxen & Perry F83. 631 000570 ; fudge factor = 8000h-limit, to be added to the start value. 632 000570 HEADER xdo,4,'(do)',DOCODE 632.1 000000 PUBLIC xdo 632.2 000570 .... DW link 632.3 000572 FF DB 0FFh ; not immediate 632.4 000573 link SET $ 632.5 000573 04 DB 4 632.6 000574 28646F29 DB '(do)' 632.7 000578 EVEN 632.8 000578 IF 'DOCODE'='DOCODE' 632.9 000578 .... xdo: DW $+2 632.10 00057A ELSE 632.11 00057A xdo: DW DOCODE 632.12 00057A ENDIF 632.13 00057A ENDM 633 00057A 2182 SUB #4,RSP ; push old loop values on return stack 634 00057C 81490200 MOV LIMIT,2(RSP) 635 000580 81480000 MOV INDEX,0(RSP) 636 000584 39400080 MOV #8000h,LIMIT ; compute 8000h-limit "fudge factor" 637 000588 3984 SUB @PSP+,LIMIT 638 00058A 0847 MOV TOS,INDEX ; loop ctr = index+fudge 639 00058C 0859 ADD LIMIT,INDEX 640 00058E 3744 MOV @PSP+,TOS ; pop new TOS 641 000590 NEXT 641.1 000590 3645 MOV @IP+,W // ; fetch word address into W 641.2 000592 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 641.3 000594 ENDM 642 000594 643 000594 ;Z (loop) R: sys1 sys2 -- | sys1 sys2 run-time code for LOOP 644 000594 ; Add 1 to the loop index. If loop terminates, clean up the 645 000594 ; return stack and skip the branch. Else take the inline branch. 646 000594 ; Note that LOOP terminates when index=8000h. 647 000594 HEADER xloop,6,'(loop)',DOCODE 647.1 000000 PUBLIC xloop 647.2 000594 .... DW link 647.3 000596 FF DB 0FFh ; not immediate 647.4 000597 link SET $ 647.5 000597 06 DB 6 647.6 000598 286C6F6F7029 DB '(loop)' 647.7 00059E EVEN 647.8 00059E IF 'DOCODE'='DOCODE' 647.9 00059E .... xloop: DW $+2 647.10 0005A0 ELSE 647.11 0005A0 xloop: DW DOCODE 647.12 0005A0 ENDIF 647.13 0005A0 ENDM 648 0005A0 1853 ADD #1,INDEX 649 0005A2 32B00001 BIT #100h,SR ; is overflow bit set? 650 0005A6 D427 JZ dobran ; no overflow = loop 651 0005A8 2553 ADD #2,IP ; overflow = loop done, skip branch ofs 652 0005AA 3841 MOV @RSP+,INDEX ; restore old loop values 653 0005AC 3941 MOV @RSP+,LIMIT 654 0005AE NEXT 654.1 0005AE 3645 MOV @IP+,W // ; fetch word address into W 654.2 0005B0 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 654.3 0005B2 ENDM 655 0005B2 656 0005B2 ;Z (+loop) n -- R: sys1 sys2 -- | sys1 sys2 run-time code for +LOOP 657 0005B2 ; Add n to the loop index. If loop terminates, clean up the 658 0005B2 ; return stack and skip the branch. Else take the inline branch. 659 0005B2 HEADER xplusloop,7,'(+loop)',DOCODE 659.1 000000 PUBLIC xplusloop 659.2 0005B2 .... DW link 659.3 0005B4 FF DB 0FFh ; not immediate 659.4 0005B5 link SET $ 659.5 0005B5 07 DB 7 659.6 0005B6 282B6C6F6F70* DB '(+loop)' 659.7 0005BD 00 EVEN 659.8 0005BE IF 'DOCODE'='DOCODE' 659.9 0005BE .... xplusloop: DW $+2 659.10 0005C0 ELSE 659.11 0005C0 xplusloop: DW DOCODE 659.12 0005C0 ENDIF 659.13 0005C0 ENDM 660 0005C0 0857 ADD TOS,INDEX 661 0005C2 3744 MOV @PSP+,TOS ; get new TOS, doesn't change flags 662 0005C4 32B00001 BIT #100h,SR ; is overflow bit set? 663 0005C8 C327 JZ dobran ; no overflow = loop 664 0005CA 2553 ADD #2,IP ; overflow = loop done, skip branch ofs 665 0005CC 3841 MOV @RSP+,INDEX ; restore old loop values 666 0005CE 3941 MOV @RSP+,LIMIT 667 0005D0 NEXT 667.1 0005D0 3645 MOV @IP+,W // ; fetch word address into W 667.2 0005D2 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 667.3 0005D4 ENDM 668 0005D4 669 0005D4 ;C I -- n R: sys1 sys2 -- sys1 sys2 get the innermost loop index 670 0005D4 HEADER II,1,'I',DOCODE 670.1 000000 PUBLIC II 670.2 0005D4 .... DW link 670.3 0005D6 FF DB 0FFh ; not immediate 670.4 0005D7 link SET $ 670.5 0005D7 01 DB 1 670.6 0005D8 49 DB 'I' 670.7 0005D9 00 EVEN 670.8 0005DA IF 'DOCODE'='DOCODE' 670.9 0005DA .... II: DW $+2 670.10 0005DC ELSE 670.11 0005DC II: DW DOCODE 670.12 0005DC ENDIF 670.13 0005DC ENDM 671 0005DC 2483 SUB #2,PSP ; make room in TOS 672 0005DE 84470000 MOV TOS,0(PSP) 673 0005E2 0748 MOV INDEX,TOS ; index = loopctr - fudge 674 0005E4 0789 SUB LIMIT,TOS 675 0005E6 NEXT 675.1 0005E6 3645 MOV @IP+,W // ; fetch word address into W 675.2 0005E8 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 675.3 0005EA ENDM 676 0005EA 677 0005EA ;C J -- n R: 4*sys -- 4*sys get the second loop index 678 0005EA HEADER JJ,1,'J',DOCODE 678.1 000000 PUBLIC JJ 678.2 0005EA .... DW link 678.3 0005EC FF DB 0FFh ; not immediate 678.4 0005ED link SET $ 678.5 0005ED 01 DB 1 678.6 0005EE 4A DB 'J' 678.7 0005EF 00 EVEN 678.8 0005F0 IF 'DOCODE'='DOCODE' 678.9 0005F0 .... JJ: DW $+2 678.10 0005F2 ELSE 678.11 0005F2 JJ: DW DOCODE 678.12 0005F2 ENDIF 678.13 0005F2 ENDM 679 0005F2 2483 SUB #2,PSP ; make room in TOS 680 0005F4 84470000 MOV TOS,0(PSP) 681 0005F8 2741 MOV @RSP,TOS ; index = loopctr - fudge 682 0005FA 17810200 SUB 2(RSP),TOS 683 0005FE NEXT 683.1 0005FE 3645 MOV @IP+,W // ; fetch word address into W 683.2 000600 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 683.3 000602 ENDM 684 000602 685 000602 ;C UNLOOP -- R: sys1 sys2 -- drop loop parms 686 000602 HEADER UNLOOP,6,'UNLOOP',DOCODE 686.1 000000 PUBLIC UNLOOP 686.2 000602 .... DW link 686.3 000604 FF DB 0FFh ; not immediate 686.4 000605 link SET $ 686.5 000605 06 DB 6 686.6 000606 554E4C4F4F50 DB 'UNLOOP' 686.7 00060C EVEN 686.8 00060C IF 'DOCODE'='DOCODE' 686.9 00060C .... UNLOOP: DW $+2 686.10 00060E ELSE 686.11 00060E UNLOOP: DW DOCODE 686.12 00060E ENDIF 686.13 00060E ENDM 687 00060E 3841 MOV @RSP+,INDEX ; restore old loop values 688 000610 3941 MOV @RSP+,LIMIT 689 000612 NEXT 689.1 000612 3645 MOV @IP+,W // ; fetch word address into W 689.2 000614 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 689.3 000616 ENDM 690 000616 691 000616 ; ---------------------------------------------- ------------------------ 692 000616 ; MULTIPLY AND DIVIDE 693 000616 694 000616 ;C UM* u1 u2 -- ud unsigned 16x16->32 mult. 695 000616 HEADER UMSTAR,3,'UM*',DOCODE 695.1 000000 PUBLIC UMSTAR 695.2 000616 .... DW link 695.3 000618 FF DB 0FFh ; not immediate 695.4 000619 link SET $ 695.5 000619 03 DB 3 695.6 00061A 554D2A DB 'UM*' 695.7 00061D 00 EVEN 695.8 00061E IF 'DOCODE'='DOCODE' 695.9 00061E .... UMSTAR: DW $+2 695.10 000620 ELSE 695.11 000620 UMSTAR: DW DOCODE 695.12 000620 ENDIF 695.13 000620 ENDM 696 000620 ; IROP1 = TOS register 697 000620 2A44 MOV @PSP,IROP2L ; get u1, leave room on stack 698 000622 ; 699 000622 ; T.I. SIGNED MULTIPLY SUBROUTINE: IROP1 x IROP2L -> IRACM|IRACL 700 000622 0C43 MPYU: CLR IRACL ; 0 -> LSBs RESULT 701 000624 0D43 CLR IRACM ; 0 -> MSBs RESULT 702 000626 ; UNSIGNED MULTIPLY AND ACCUMULATE SUBROUTINE: 703 000626 ; (IROP1 x IROP2L) + IRACM|IRACL -> IRACM|IRACL 704 000626 0B43 MACU: CLR IROP2M ; MSBs MULTIPLIER 705 000628 1643 MOV #1,IRBT ; BIT TEST REGISTER 706 00062A 07B6 L$002: BIT IRBT,IROP1 ; TEST ACTUAL BIT 707 00062C 0224 JZ L$01 ; IF 0: DO NOTHING 708 00062E 0C5A ADD IROP2L,IRACL ; IF 1: ADD MULTIPLIER TO RESULT 709 000630 0D6B ADDC IROP2M,IRACM 710 000632 0A5A L$01: RLA IROP2L ; MULTIPLIER x 2 711 000634 0B6B RLC IROP2M 712 000636 ; 713 000636 0656 RLA IRBT ; NEXT BIT TO TEST 714 000638 F82B JNC L$002 ; IF BIT IN CARRY: FINISHED 715 00063A ; END T.I. ROUTINE section 5.1.1 of MSP430 Family Application Reports 716 00063A 844C0000 MOV IRACL,0(PSP) ; low result on stack 717 00063E 074D MOV IRACM,TOS ; high result in TOS 718 000640 NEXT 718.1 000640 3645 MOV @IP+,W // ; fetch word address into W 718.2 000642 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 718.3 000644 ENDM 719 000644 720 000644 ;C UM/MOD ud u1 -- u2 u3 unsigned 32/16->16 721 000644 HEADER UMSLASHMOD,6,'UM/MOD',DOCODE 721.1 000000 PUBLIC UMSLASHMOD 721.2 000644 .... DW link 721.3 000646 FF DB 0FFh ; not immediate 721.4 000647 link SET $ 721.5 000647 06 DB 6 721.6 000648 554D2F4D4F44 DB 'UM/MOD' 721.7 00064E EVEN 721.8 00064E IF 'DOCODE'='DOCODE' 721.9 00064E .... UMSLASHMOD: DW $+2 721.10 000650 ELSE 721.11 000650 UMSLASHMOD: DW DOCODE 721.12 000650 ENDIF 721.13 000650 ENDM 722 000650 ; IROP1 = TOS register 723 000650 3B44 MOV @PSP+,IROP2M ; get ud hi 724 000652 2A44 MOV @PSP,IROP2L ; get ud lo, leave room on stack 725 000654 ; 726 000654 ; T.I. UNSIGNED DIVISION SUBROUTINE 32-BIT BY 16-BIT 727 000654 ; IROP2M|IROP2L : IROP1 -> IRACL REMAINDER IN IROP2M 728 000654 ; RETURN: CARRY = 0: OK CARRY = 1: QUOTIENT > 16 BITS 729 000654 0C43 DIVIDE: CLR IRACL ; CLEAR RESULT 730 000656 36401100 MOV #17,IRBT ; INITIALIZE LOOP COUNTER 731 00065A 0B97 DIV1: CMP IROP1,IROP2M ; 732 00065C 0128 JLO DIV2 733 00065E 0B87 SUB IROP1,IROP2M 734 000660 0C6C DIV2: RLC IRACL 735 000662 092C JC DIV4 ; Error: result > 16 bits 736 000664 1683 DEC IRBT ; Decrement loop counter 737 000666 0624 JZ DIV3 ; Is 0: terminate w/o error 738 000668 0A5A RLA IROP2L 739 00066A 0B6B RLC IROP2M 740 00066C F62B JNC DIV1 741 00066E 0B87 SUB IROP1,IROP2M 742 000670 12D3 SETC 743 000672 F63F JMP DIV2 744 000674 12C3 DIV3: CLRC ; No error, C = 0 745 000676 DIV4: ; Error indication in C 746 000676 ; END T.I. ROUTINE Section 5.1.5 of MSP430 Family Application Reports 747 000676 844B0000 MOV IROP2M,0(PSP) ; remainder on stack 748 00067A 074C MOV IRACL,TOS ; quotient in TOS 749 00067C NEXT 749.1 00067C 3645 MOV @IP+,W // ; fetch word address into W 749.2 00067E 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 749.3 000680 ENDM 750 000680 751 000680 ; ---------------------------------------------- ------------------------ 752 000680 ; BLOCK AND STRING OPERATIONS 753 000680 754 000680 ;C FILL c-addr u char -- fill memory with char 755 000680 HEADER FILL,4,'FILL',DOCODE 755.1 000000 PUBLIC FILL 755.2 000680 .... DW link 755.3 000682 FF DB 0FFh ; not immediate 755.4 000683 link SET $ 755.5 000683 04 DB 4 755.6 000684 46494C4C DB 'FILL' 755.7 000688 EVEN 755.8 000688 IF 'DOCODE'='DOCODE' 755.9 000688 .... FILL: DW $+2 755.10 00068A ELSE 755.11 00068A FILL: DW DOCODE 755.12 00068A ENDIF 755.13 00068A ENDM 756 00068A 3A44 MOV @PSP+,X ; count 757 00068C 3644 MOV @PSP+,W ; address 758 00068E 0A93 CMP #0,X 759 000690 0524 JZ FILL_X 760 000692 C6470000 FILL_1: MOV.B TOS,0(W) ; store char in memory 761 000696 1653 ADD #1,W 762 000698 1A83 SUB #1,X 763 00069A FB23 JNZ FILL_1 764 00069C 3744 FILL_X: MOV @PSP+,TOS ; pop new TOS 765 00069E NEXT 765.1 00069E 3645 MOV @IP+,W // ; fetch word address into W 765.2 0006A0 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 765.3 0006A2 ENDM 766 0006A2 767 0006A2 ;X CMOVE c-addr1 c-addr2 u -- move from bottom 768 0006A2 ; as defined in the ANSI optional String word set 769 0006A2 ; On byte machines, CMOVE and CMOVE> are logical 770 0006A2 ; factors of MOVE. They are easy to implement on 771 0006A2 ; CPUs which have a block-move instruction. 772 0006A2 HEADER CMOVE,5,'CMOVE',DOCODE 772.1 000000 PUBLIC CMOVE 772.2 0006A2 .... DW link 772.3 0006A4 FF DB 0FFh ; not immediate 772.4 0006A5 link SET $ 772.5 0006A5 05 DB 5 772.6 0006A6 434D4F5645 DB 'CMOVE' 772.7 0006AB 00 EVEN 772.8 0006AC IF 'DOCODE'='DOCODE' 772.9 0006AC .... CMOVE: DW $+2 772.10 0006AE ELSE 772.11 0006AE CMOVE: DW DOCODE 772.12 0006AE ENDIF 772.13 0006AE ENDM 773 0006AE 3644 MOV @PSP+,W ; dest adrs 774 0006B0 3A44 MOV @PSP+,X ; src adrs 775 0006B2 0793 CMP #0,TOS 776 0006B4 0524 JZ CMOVE_X 777 0006B6 F64A0000 CMOVE_1: MOV.B @X+,0(W) ; copy byte 778 0006BA 1653 ADD #1,W 779 0006BC 1783 SUB #1,TOS 780 0006BE FB23 JNZ CMOVE_1 781 0006C0 3744 CMOVE_X: MOV @PSP+,TOS ; pop new TOS 782 0006C2 NEXT 782.1 0006C2 3645 MOV @IP+,W // ; fetch word address into W 782.2 0006C4 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 782.3 0006C6 ENDM 783 0006C6 784 0006C6 ;X CMOVE> c-addr1 c-addr2 u -- move from top 785 0006C6 ; as defined in the ANSI optional String word set 786 0006C6 HEADER CMOVEUP,6,'CMOVE>',DOCODE 786.1 000000 PUBLIC CMOVEUP 786.2 0006C6 .... DW link 786.3 0006C8 FF DB 0FFh ; not immediate 786.4 0006C9 link SET $ 786.5 0006C9 06 DB 6 786.6 0006CA 434D4F56453E DB 'CMOVE>' 786.7 0006D0 EVEN 786.8 0006D0 IF 'DOCODE'='DOCODE' 786.9 0006D0 .... CMOVEUP: DW $+2 786.10 0006D2 ELSE 786.11 0006D2 CMOVEUP: DW DOCODE 786.12 0006D2 ENDIF 786.13 0006D2 ENDM 787 0006D2 3644 MOV @PSP+,W ; dest adrs 788 0006D4 3A44 MOV @PSP+,X ; src adrs 789 0006D6 0793 CMP #0,TOS 790 0006D8 0824 JZ CMOVU_X 791 0006DA 0657 ADD TOS,W ; start at end 792 0006DC 0A57 ADD TOS,X 793 0006DE 1A83 CMOVU_1: SUB #1,X 794 0006E0 1683 SUB #1,W 795 0006E2 E64A0000 MOV.B @X,0(W) ; copy byte 796 0006E6 1783 SUB #1,TOS 797 0006E8 FA23 JNZ CMOVU_1 798 0006EA 3744 CMOVU_X: MOV @PSP+,TOS ; pop new TOS 799 0006EC NEXT 799.1 0006EC 3645 MOV @IP+,W // ; fetch word address into W 799.2 0006EE 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 799.3 0006F0 ENDM 800 0006F0 801 0006F0 ;Z I->D c-addr1 c-addr2 u -- move Code->Data 802 0006F0 ; Block move from Code space to Data space. 803 0006F0 ; On the MSP430, this is the same as CMOVE. 804 0006F0 HEADER ITOD,4,'I->D',CMOVE+2 804.1 000000 PUBLIC ITOD 804.2 0006F0 .... DW link 804.3 0006F2 FF DB 0FFh ; not immediate 804.4 0006F3 link SET $ 804.5 0006F3 04 DB 4 804.6 0006F4 492D3E44 DB 'I->D' 804.7 0006F8 EVEN 804.8 0006F8 IF 'CMOVE+2'='DOCODE' 804.9 0006F8 ITOD: DW $+2 804.10 0006F8 ELSE 804.11 0006F8 .... ITOD: DW CMOVE+2 804.12 0006FA ENDIF 804.13 0006FA ENDM 805 0006FA 806 0006FA ;Z SKIP c-addr u c -- c-addr' u' skip matching chars 807 0006FA ; Although SKIP, SCAN, and S= are perhaps not the ideal factors 808 0006FA ; of WORD and FIND, they closely follow the string operations 809 0006FA ; available on many CPUs, and so are easy to implement and fast. 810 0006FA HEADER SKIP,4,'SKIP',DOCODE 810.1 000000 PUBLIC SKIP 810.2 0006FA .... DW link 810.3 0006FC FF DB 0FFh ; not immediate 810.4 0006FD link SET $ 810.5 0006FD 04 DB 4 810.6 0006FE 534B4950 DB 'SKIP' 810.7 000702 EVEN 810.8 000702 IF 'DOCODE'='DOCODE' 810.9 000702 .... SKIP: DW $+2 810.10 000704 ELSE 810.11 000704 SKIP: DW DOCODE 810.12 000704 ENDIF 810.13 000704 ENDM 811 000704 3A44 MOV @PSP+,X ; get count 812 000706 2644 MOV @PSP,W ; get address, leave space on stack 813 000708 0A93 CMP #0,X 814 00070A 0524 JZ SKIP_X 815 00070C 6796 SKIP_1: CMP.B @W,TOS ; does character match? 816 00070E 0320 JNZ SKIP_X ; no, we are done 817 000710 1653 ADD #1,W 818 000712 1A83 SUB #1,X 819 000714 FB23 JNZ SKIP_1 820 000716 84460000 SKIP_X: MOV W,0(PSP) ; store updated address on stack 821 00071A 074A MOV X,TOS ; updated count to TOS 822 00071C NEXT 822.1 00071C 3645 MOV @IP+,W // ; fetch word address into W 822.2 00071E 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 822.3 000720 ENDM 823 000720 824 000720 ;Z SCAN c-addr u c -- c-addr' u' find matching char 825 000720 HEADER SCAN,4,'SCAN',DOCODE 825.1 000000 PUBLIC SCAN 825.2 000720 .... DW link 825.3 000722 FF DB 0FFh ; not immediate 825.4 000723 link SET $ 825.5 000723 04 DB 4 825.6 000724 5343414E DB 'SCAN' 825.7 000728 EVEN 825.8 000728 IF 'DOCODE'='DOCODE' 825.9 000728 .... SCAN: DW $+2 825.10 00072A ELSE 825.11 00072A SCAN: DW DOCODE 825.12 00072A ENDIF 825.13 00072A ENDM 826 00072A 3A44 MOV @PSP+,X ; get count 827 00072C 2644 MOV @PSP,W ; get address, leave space on stack 828 00072E 0A93 CMP #0,X 829 000730 0524 JZ SCAN_X 830 000732 6796 SCAN_1: CMP.B @W,TOS ; does character match? 831 000734 0324 JZ SCAN_X ; yes, we are done 832 000736 1653 ADD #1,W 833 000738 1A83 SUB #1,X 834 00073A FB23 JNZ SCAN_1 835 00073C 84460000 SCAN_X: MOV W,0(PSP) ; store updated address on stack 836 000740 074A MOV X,TOS ; updated count to TOS 837 000742 NEXT 837.1 000742 3645 MOV @IP+,W // ; fetch word address into W 837.2 000744 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 837.3 000746 ENDM 838 000746 839 000746 ;Z S= c-addr1 c-addr2 u -- n string compare 840 000746 ;Z S= n<0: s10: s1>s2 841 000746 HEADER SEQUAL,2,'S=',DOCODE 841.1 000000 PUBLIC SEQUAL 841.2 000746 .... DW link 841.3 000748 FF DB 0FFh ; not immediate 841.4 000749 link SET $ 841.5 000749 02 DB 2 841.6 00074A 533D DB 'S=' 841.7 00074C EVEN 841.8 00074C IF 'DOCODE'='DOCODE' 841.9 00074C .... SEQUAL: DW $+2 841.10 00074E ELSE 841.11 00074E SEQUAL: DW DOCODE 841.12 00074E ENDIF 841.13 00074E ENDM 842 00074E 3644 MOV @PSP+,W ; adrs2 843 000750 3A44 MOV @PSP+,X ; adrs1 844 000752 0793 CMP #0,TOS 845 000754 0A24 JZ SEQU_X 846 000756 FA960000 SEQU_1: CMP.B @W+,0(X) ; compare char1-char 2 847 00075A 0420 JNZ SMISMATCH 848 00075C 1A53 ADD #1,X 849 00075E 1783 SUB #1,TOS 850 000760 FA23 JNZ SEQU_1 851 000762 ; no mismatch found, strings are equal, TOS=0 852 000762 033C JMP SEQU_X 853 000764 ; mismatch found, CY clear if borrow set (s10: s1>s2 861 00076E ; For Harvard model, c-addr1 is Data, c-addr2 is Header. 862 00076E ; On MSP430, both use the same fetch instruction , so N= is the same as S=. 863 00076E HEADER NEQUAL,2,'N=',SEQUAL+2 863.1 000000 PUBLIC NEQUAL 863.2 00076E .... DW link 863.3 000770 FF DB 0FFh ; not immediate 863.4 000771 link SET $ 863.5 000771 02 DB 2 863.6 000772 4E3D DB 'N=' 863.7 000774 EVEN 863.8 000774 IF 'SEQUAL+2'='DOCODE' 863.9 000774 NEQUAL: DW $+2 863.10 000774 ELSE 863.11 000774 .... NEQUAL: DW SEQUAL+2 863.12 000776 ENDIF 863.13 000776 ENDM 864 000776 865 000776 ; ---------------------------------------------- ------------------------ 866 000776 ; TERMINAL I/O 867 000776 868 000776 ;C EMIT c -- output character to console 869 000776 HEADER EMIT,4,'EMIT',DOCODE 869.1 000000 PUBLIC EMIT 869.2 000776 .... DW link 869.3 000778 FF DB 0FFh ; not immediate 869.4 000779 link SET $ 869.5 000779 04 DB 4 869.6 00077A 454D4954 DB 'EMIT' 869.7 00077E EVEN 869.8 00077E IF 'DOCODE'='DOCODE' 869.9 00077E .... EMIT: DW $+2 869.10 000780 ELSE 869.11 000780 EMIT: DW DOCODE 869.12 000780 ENDIF 869.13 000780 ENDM 870 000780 EMITLOOP: 871 000780 E2B30300 BIT.B #UCA0TXIFG,&IFG2 872 000784 FD27 JZ EMITLOOP 873 000786 C2476700 MOV.B TOS,&UCA0TXBUF 874 00078A 3744 MOV @PSP+,TOS 875 00078C NEXT 875.1 00078C 3645 MOV @IP+,W // ; fetch word address into W 875.2 00078E 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 875.3 000790 ENDM 876 000790 877 000790 ;C KEY -- c get character from keyboard 878 000790 HEADER KEY,3,'KEY',DOCODE 878.1 000000 PUBLIC KEY 878.2 000790 .... DW link 878.3 000792 FF DB 0FFh ; not immediate 878.4 000793 link SET $ 878.5 000793 03 DB 3 878.6 000794 4B4559 DB 'KEY' 878.7 000797 00 EVEN 878.8 000798 IF 'DOCODE'='DOCODE' 878.9 000798 .... KEY: DW $+2 878.10 00079A ELSE 878.11 00079A KEY: DW DOCODE 878.12 00079A ENDIF 878.13 00079A ENDM 879 00079A KEYLOOP: 880 00079A D2B30300 BIT.B #UCA0RXIFG,&IFG2 881 00079E FD27 JZ KEYLOOP 882 0007A0 2483 SUB #2,PSP ; 1 push old TOS.. 883 0007A2 84470000 MOV TOS,0(PSP) ; 4 ..onto stack 884 0007A6 57426600 MOV.B &UCA0RXBUF,TOS ; read character into TOS 885 0007AA donoop: 886 0007AA donext: NEXT 886.1 0007AA 3645 MOV @IP+,W // ; fetch word address into W 886.2 0007AC 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 886.3 0007AE ENDM 887 0007AE 888 0007AE ;X KEY? -- f return true if char waiting 889 0007AE HEADER KEYQ,4,'KEY?',DOCODE 889.1 000000 PUBLIC KEYQ 889.2 0007AE .... DW link 889.3 0007B0 FF DB 0FFh ; not immediate 889.4 0007B1 link SET $ 889.5 0007B1 04 DB 4 889.6 0007B2 4B45593F DB 'KEY?' 889.7 0007B6 EVEN 889.8 0007B6 IF 'DOCODE'='DOCODE' 889.9 0007B6 .... KEYQ: DW $+2 889.10 0007B8 ELSE 889.11 0007B8 KEYQ: DW DOCODE 889.12 0007B8 ENDIF 889.13 0007B8 ENDM 890 0007B8 2483 SUB #2,PSP ; 1 push old TOS.. 891 0007BA 84470000 MOV TOS,0(PSP) ; 4 ..onto stack 892 0007BE D2B30300 BIT.B #UCA0RXIFG,&IFG2 893 0007C2 A722 JNZ TOSTRUE 894 0007C4 953E JMP TOSFALSE 895 0007C6 896 0007C6 ;X ZERO -- 0 put zero on stack. Often usesd word. 897 0007C6 HEADER ZERO,4,'ZERO',DOCON 897.1 000000 PUBLIC ZERO 897.2 0007C6 .... DW link 897.3 0007C8 FF DB 0FFh ; not immediate 897.4 0007C9 link SET $ 897.5 0007C9 04 DB 4 897.6 0007CA 5A45524F DB 'ZERO' 897.7 0007CE EVEN 897.8 0007CE IF 'DOCON'='DOCODE' 897.9 0007CE ZERO: DW $+2 897.10 0007CE ELSE 897.11 0007CE .... ZERO: DW DOCON 897.12 0007D0 ENDIF 897.13 0007D0 ENDM 898 0007D0 0000 DW 0 899 0007D2 ; ---------------------------------------------- ------------------------ 900 0007D2 ; We #include the following source files, rather than compiling them 901 0007D2 ; separately, so that they can inherit the value of 'link'. 902 0007D2 903 0007D2 #include "4e-deps430G2553.s43" 1 0007D2 ; ---------------------------------------------- ------------------------ 2 0007D2 ; 4e4th is a Forth based on CamelForth 3 0007D2 ; for the Texas Instruments MSP430 4 0007D2 ; 5 0007D2 ; This program is free software; you can redistribute it and/or modify 6 0007D2 ; it under the terms of the GNU General Public License as published by 7 0007D2 ; the Free Software Foundation; either version 3 of the License, or 8 0007D2 ; (at your option) any later version. 9 0007D2 ; 10 0007D2 ; This program is distributed in the hope that it will be useful, 11 0007D2 ; but WITHOUT ANY WARRANTY; without even the implied warranty of 12 0007D2 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 0007D2 ; GNU General Public License for more details. 14 0007D2 ; 15 0007D2 ; You should have received a copy of the GNU General Public License 16 0007D2 ; along with this program. If not, see . 17 0007D2 ; 18 0007D2 ; See LICENSE TERMS in Brads file readme.txt as well. 19 0007D2 20 0007D2 ; ---------------------------------------------- ------------------------ 21 0007D2 ; 4e-deps430.s43: CPU and Model Dependencies - MSP430G2553 22 0007D2 ; ---------------------------------------------- ------------------------ 23 0007D2 24 0007D2 ; Forth words are documented as follows: 25 0007D2 ;x NAME stack -- stack description 26 0007D2 ; where x=C for ANS Forth Core words, X for ANS 27 0007D2 ; Extensions, Z for internal or private words. 28 0007D2 ; 29 0007D2 ; Indirect-Threaded Forth model for T.I. MSP430 30 0007D2 ; cell size is 16 bits (2 bytes) 31 0007D2 ; char size is 8 bits (1 byte) 32 0007D2 ; address unit is 8 bits (1 byte), i.e., addresses are byte-aligned. 33 0007D2 ; ---------------------------------------------- ------------------------ 34 0007D2 35 0007D2 ; ---------------------------------------------- ------------------------ 36 0007D2 ; ALIGNMENT AND PORTABILITY OPERATORS 37 0007D2 ; Many of these are synonyms for other words, 38 0007D2 ; and so are defined as CODE words. 39 0007D2 40 0007D2 ;C ALIGN -- align HERE 41 0007D2 ; IHERE 1 AND IALLOT ; 42 0007D2 HEADER ALIGNN,5,'ALIGN',DOCOLON 42.1 000000 PUBLIC ALIGNN 42.2 0007D2 .... DW link 42.3 0007D4 FF DB 0FFh ; not immediate 42.4 0007D5 link SET $ 42.5 0007D5 05 DB 5 42.6 0007D6 414C49474E DB 'ALIGN' 42.7 0007DB 00 EVEN 42.8 0007DC IF 'DOCOLON'='DOCODE' 42.9 0007DC ALIGNN: DW $+2 42.10 0007DC ELSE 42.11 0007DC .... ALIGNN: DW DOCOLON 42.12 0007DE ENDIF 42.13 0007DE ENDM 43 0007DE ........0100* DW IHERE,lit,1,ANDD,IALLOT,EXIT 44 0007EA 45 0007EA ;C ALIGNED addr -- a-addr align given addr 46 0007EA ; DUP 1 AND + ; 47 0007EA HEADER ALIGNED,7,'ALIGNED',DOCOLON 47.1 000000 PUBLIC ALIGNED 47.2 0007EA .... DW link 47.3 0007EC FF DB 0FFh ; not immediate 47.4 0007ED link SET $ 47.5 0007ED 07 DB 7 47.6 0007EE 414C49474E45* DB 'ALIGNED' 47.7 0007F5 00 EVEN 47.8 0007F6 IF 'DOCOLON'='DOCODE' 47.9 0007F6 ALIGNED: DW $+2 47.10 0007F6 ELSE 47.11 0007F6 .... ALIGNED: DW DOCOLON 47.12 0007F8 ENDIF 47.13 0007F8 ENDM 48 0007F8 ........0100* DW DUP,lit,1,ANDD,PLUS,EXIT 49 000804 50 000804 ;Z CELL -- n size of one cell 51 000804 HEADER CELL,4,'CELL',DOCON 51.1 000000 PUBLIC CELL 51.2 000804 .... DW link 51.3 000806 FF DB 0FFh ; not immediate 51.4 000807 link SET $ 51.5 000807 04 DB 4 51.6 000808 43454C4C DB 'CELL' 51.7 00080C EVEN 51.8 00080C IF 'DOCON'='DOCODE' 51.9 00080C CELL: DW $+2 51.10 00080C ELSE 51.11 00080C .... CELL: DW DOCON 51.12 00080E ENDIF 51.13 00080E ENDM 52 00080E 0200 dw 2 53 000810 54 000810 ;C CELL+ a-addr1 -- a-addr2 add cell size 55 000810 ; 2 + ; 56 000810 HEADER CELLPLUS,5,'CELL+',DOCODE 56.1 000000 PUBLIC CELLPLUS 56.2 000810 .... DW link 56.3 000812 FF DB 0FFh ; not immediate 56.4 000813 link SET $ 56.5 000813 05 DB 5 56.6 000814 43454C4C2B DB 'CELL+' 56.7 000819 00 EVEN 56.8 00081A IF 'DOCODE'='DOCODE' 56.9 00081A .... CELLPLUS: DW $+2 56.10 00081C ELSE 56.11 00081C CELLPLUS: DW DOCODE 56.12 00081C ENDIF 56.13 00081C ENDM 57 00081C 2753 ADD #2,TOS 58 00081E C53F JMP donext 59 000820 60 000820 ;C CELLS n1 -- n2 cells->adrs units 61 000820 HEADER CELLS,5,'CELLS',TWOSTAR+2 61.1 000000 PUBLIC CELLS 61.2 000820 .... DW link 61.3 000822 FF DB 0FFh ; not immediate 61.4 000823 link SET $ 61.5 000823 05 DB 5 61.6 000824 43454C4C53 DB 'CELLS' 61.7 000829 00 EVEN 61.8 00082A IF 'TWOSTAR+2'='DOCODE' 61.9 00082A CELLS: DW $+2 61.10 00082A ELSE 61.11 00082A .... CELLS: DW TWOSTAR+2 61.12 00082C ENDIF 61.13 00082C ENDM 62 00082C 63 00082C ;C CHAR+ c-addr1 -- c-addr2 add char size 64 00082C HEADER CHARPLUS,5,'CHAR+',ONEPLUS+2 64.1 000000 PUBLIC CHARPLUS 64.2 00082C .... DW link 64.3 00082E FF DB 0FFh ; not immediate 64.4 00082F link SET $ 64.5 00082F 05 DB 5 64.6 000830 434841522B DB 'CHAR+' 64.7 000835 00 EVEN 64.8 000836 IF 'ONEPLUS+2'='DOCODE' 64.9 000836 CHARPLUS: DW $+2 64.10 000836 ELSE 64.11 000836 .... CHARPLUS: DW ONEPLUS+2 64.12 000838 ENDIF 64.13 000838 ENDM 65 000838 66 000838 ;C CHARS n1 -- n2 chars->adrs units 67 000838 HEADER CHARS,5,'CHARS',donoop 67.1 000000 PUBLIC CHARS 67.2 000838 .... DW link 67.3 00083A FF DB 0FFh ; not immediate 67.4 00083B link SET $ 67.5 00083B 05 DB 5 67.6 00083C 4348415253 DB 'CHARS' 67.7 000841 00 EVEN 67.8 000842 IF 'donoop'='DOCODE' 67.9 000842 CHARS: DW $+2 67.10 000842 ELSE 67.11 000842 .... CHARS: DW donoop 67.12 000844 ENDIF 67.13 000844 ENDM 68 000844 69 000844 ;C >BODY xt -- a-addr adrs of CREATE data 70 000844 ; 2+ ; 8086 (3 byte CALL) 71 000844 HEADER TOBODY,5,'>BODY',CELLPLUS+2 71.1 000000 PUBLIC TOBODY 71.2 000844 .... DW link 71.3 000846 FF DB 0FFh ; not immediate 71.4 000847 link SET $ 71.5 000847 05 DB 5 71.6 000848 3E424F4459 DB '>BODY' 71.7 00084D 00 EVEN 71.8 00084E IF 'CELLPLUS+2'='DOCODE' 71.9 00084E TOBODY: DW $+2 71.10 00084E ELSE 71.11 00084E .... TOBODY: DW CELLPLUS+2 71.12 000850 ENDIF 71.13 000850 ENDM 72 000850 73 000850 ;X COMPILE, xt -- append execution token 74 000850 ; I called this word ,XT before I discovered that it is defined in the 75 000850 ; ANSI standard as COMPILE,. On a DTC Forth this simply appends xt 76 000850 ; (like , ) but on an STC Forth this must append 'CALL xt'. 77 000850 HEADER COMMAXT,8,'COMPILE,',DOALIAS 77.1 000000 PUBLIC COMMAXT 77.2 000850 .... DW link 77.3 000852 FF DB 0FFh ; not immediate 77.4 000853 link SET $ 77.5 000853 08 DB 8 77.6 000854 434F4D50494C* DB 'COMPILE,' 77.7 00085C EVEN 77.8 00085C IF 'DOALIAS'='DOCODE' 77.9 00085C COMMAXT: DW $+2 77.10 00085C ELSE 77.11 00085C .... COMMAXT: DW DOALIAS 77.12 00085E ENDIF 77.13 00085E ENDM 78 00085E .... DW ICOMMA 79 000860 80 000860 ;Z !CF adrs cfa -- set code action of a word 81 000860 ; I! ; 82 000860 ; Indirect threaded model just stores adrs in cfa field. 83 000860 HEADER STORECF,3,'!CF',DOALIAS 83.1 000000 PUBLIC STORECF 83.2 000860 .... DW link 83.3 000862 FF DB 0FFh ; not immediate 83.4 000863 link SET $ 83.5 000863 03 DB 3 83.6 000864 214346 DB '!CF' 83.7 000867 00 EVEN 83.8 000868 IF 'DOALIAS'='DOCODE' 83.9 000868 STORECF: DW $+2 83.10 000868 ELSE 83.11 000868 .... STORECF: DW DOALIAS 83.12 00086A ENDIF 83.13 00086A ENDM 84 00086A .... DW ISTORE 85 00086C 86 00086C ;Z ,CF adrs -- append a code field 87 00086C ; IHERE !CF 2 IALLOT ; MSP430 VERSION (2 bytes) 88 00086C HEADER COMMACF,3,',CF',DOCOLON 88.1 000000 PUBLIC COMMACF 88.2 00086C .... DW link 88.3 00086E FF DB 0FFh ; not immediate 88.4 00086F link SET $ 88.5 00086F 03 DB 3 88.6 000870 2C4346 DB ',CF' 88.7 000873 00 EVEN 88.8 000874 IF 'DOCOLON'='DOCODE' 88.9 000874 COMMACF: DW $+2 88.10 000874 ELSE 88.11 000874 .... COMMACF: DW DOCOLON 88.12 000876 ENDIF 88.13 000876 ENDM 89 000876 ............* DW IHERE,STORECF,lit,2,IALLOT,EXIT 90 000882 91 000882 ;Z ,CALL adrs -- append a subroutine CALL 92 000882 ; MSP430: 128x is call, Ad=11, Dreg=0000 (PC) thus append 12B0,adrs. 93 000882 HEADER COMMACALL,5,',CALL',DOCOLON 93.1 000000 PUBLIC COMMACALL 93.2 000882 .... DW link 93.3 000884 FF DB 0FFh ; not immediate 93.4 000885 link SET $ 93.5 000885 05 DB 5 93.6 000886 2C43414C4C DB ',CALL' 93.7 00088B 00 EVEN 93.8 00088C IF 'DOCOLON'='DOCODE' 93.9 00088C COMMACALL: DW $+2 93.10 00088C ELSE 93.11 00088C .... COMMACALL: DW DOCOLON 93.12 00088E ENDIF 93.13 00088E ENDM 94 00088E ....B012....* DW lit,12B0h,ICOMMA,ICOMMA,EXIT 95 000898 96 000898 ;Z ,JMP adrs -- append an absolute 16-bit JMP (MOV #xx,PC) 97 000898 ; MSP430: opcode 4, Sreg=0000, Ad=0, As=11 (immed), Dreg=0000 (PC) 98 000898 ; thus append 4030,adrs. 99 000898 HEADER COMMAJMP,4,',JMP',DOCOLON 99.1 000000 PUBLIC COMMAJMP 99.2 000898 .... DW link 99.3 00089A FF DB 0FFh ; not immediate 99.4 00089B link SET $ 99.5 00089B 04 DB 4 99.6 00089C 2C4A4D50 DB ',JMP' 99.7 0008A0 EVEN 99.8 0008A0 IF 'DOCOLON'='DOCODE' 99.9 0008A0 COMMAJMP: DW $+2 99.10 0008A0 ELSE 99.11 0008A0 .... COMMAJMP: DW DOCOLON 99.12 0008A2 ENDIF 99.13 0008A2 ENDM 100 0008A2 ....3040....* DW lit,4030h,ICOMMA,ICOMMA,EXIT 101 0008AC 102 0008AC ;Z !COLON -- change code field to DOCOLON 103 0008AC ; -2 IALLOT DOCOLON-adrs ,CF ; 104 0008AC ; This should be used immediately after CREATE. 105 0008AC ; This is made a distinct word, because on an STC 106 0008AC ; Forth, colon definitions have no code field. 107 0008AC HEADER STORCOLON,6,'!COLON',DOCOLON 107.1 000000 PUBLIC STORCOLON 107.2 0008AC .... DW link 107.3 0008AE FF DB 0FFh ; not immediate 107.4 0008AF link SET $ 107.5 0008AF 06 DB 6 107.6 0008B0 21434F4C4F4E DB '!COLON' 107.7 0008B6 EVEN 107.8 0008B6 IF 'DOCOLON'='DOCODE' 107.9 0008B6 STORCOLON: DW $+2 107.10 0008B6 ELSE 107.11 0008B6 .... STORCOLON: DW DOCOLON 107.12 0008B8 ENDIF 107.13 0008B8 ENDM 108 0008B8 ....FEFF.... DW lit,-2,IALLOT 109 0008BE ............* DW lit,DOCOLON,COMMACF,EXIT 110 0008C6 111 0008C6 ;Z ,EXIT -- append hi-level EXIT action 112 0008C6 ; ['] EXIT ,XT ; 113 0008C6 ; This is made a distinct word, because on an STC 114 0008C6 ; Forth, it appends a RET instruction, not an xt. 115 0008C6 HEADER CEXIT,5,',EXIT',DOCOLON 115.1 000000 PUBLIC CEXIT 115.2 0008C6 .... DW link 115.3 0008C8 FF DB 0FFh ; not immediate 115.4 0008C9 link SET $ 115.5 0008C9 05 DB 5 115.6 0008CA 2C45584954 DB ',EXIT' 115.7 0008CF 00 EVEN 115.8 0008D0 IF 'DOCOLON'='DOCODE' 115.9 0008D0 CEXIT: DW $+2 115.10 0008D0 ELSE 115.11 0008D0 .... CEXIT: DW DOCOLON 115.12 0008D2 ENDIF 115.13 0008D2 ENDM 116 0008D2 ............* DW lit,EXIT,COMMAXT,EXIT 117 0008DA 118 0008DA ; ---------------------------------------------- ------------------------ 119 0008DA ; CONTROL STRUCTURES 120 0008DA ; These words allow Forth control structure words 121 0008DA ; to be defined portably. 122 0008DA 123 0008DA ;Z ,BRANCH xt -- append a branch instructio n 124 0008DA ; xt is the branch operator to use, e.g. qbranch or (loop). 125 0008DA ; It does NOT append the destination address. 126 0008DA ; On the MSP430 this is equivalent to ,XT (above). 127 0008DA HEADER COMMABRANCH,7,',BRANCH',DOALIAS 127.1 000000 PUBLIC COMMABRANCH 127.2 0008DA .... DW link 127.3 0008DC FF DB 0FFh ; not immediate 127.4 0008DD link SET $ 127.5 0008DD 07 DB 7 127.6 0008DE 2C4252414E43* DB ',BRANCH' 127.7 0008E5 00 EVEN 127.8 0008E6 IF 'DOALIAS'='DOCODE' 127.9 0008E6 COMMABRANCH: DW $+2 127.10 0008E6 ELSE 127.11 0008E6 .... COMMABRANCH: DW DOALIAS 127.12 0008E8 ENDIF 127.13 0008E8 ENDM 128 0008E8 .... DW ICOMMA 129 0008EA 130 0008EA ;Z ,DEST dest -- append a branch address 131 0008EA ; IHERE - , ; 132 0008EA ; This appends the given destination address to the branch instruction. 133 0008EA ; The MSP430 uses relative addressing from the location of the offset cell, 134 0008EA ; i.e., to branch to FOO the offset cell at $ contains FOO-$. 135 0008EA HEADER COMMADEST,5,',DEST',DOCOLON 135.1 000000 PUBLIC COMMADEST 135.2 0008EA .... DW link 135.3 0008EC FF DB 0FFh ; not immediate 135.4 0008ED link SET $ 135.5 0008ED 05 DB 5 135.6 0008EE 2C44455354 DB ',DEST' 135.7 0008F3 00 EVEN 135.8 0008F4 IF 'DOCOLON'='DOCODE' 135.9 0008F4 COMMADEST: DW $+2 135.10 0008F4 ELSE 135.11 0008F4 .... COMMADEST: DW DOCOLON 135.12 0008F6 ENDIF 135.13 0008F6 ENDM 136 0008F6 ............* DW IHERE,MINUS,ICOMMA,EXIT 137 0008FE 138 0008FE ;Z !DEST dest adrs -- change a branch dest'n 139 0008FE ; TUCK - SWAP I! ; 140 0008FE ; Changes the destination address found at 'adrs' to the given 'dest'. 141 0008FE ; The MSP430 uses relative addressing from the location of the offset cell, 142 0008FE ; i.e., to branch to FOO the offset cell at $ contains FOO-$. 143 0008FE HEADER STOREDEST,5,'!DEST',DOCOLON 143.1 000000 PUBLIC STOREDEST 143.2 0008FE .... DW link 143.3 000900 FF DB 0FFh ; not immediate 143.4 000901 link SET $ 143.5 000901 05 DB 5 143.6 000902 2144455354 DB '!DEST' 143.7 000907 00 EVEN 143.8 000908 IF 'DOCOLON'='DOCODE' 143.9 000908 STOREDEST: DW $+2 143.10 000908 ELSE 143.11 000908 .... STOREDEST: DW DOCOLON 143.12 00090A ENDIF 143.13 00090A ENDM 144 00090A ............* DW TUCK,MINUS,SWAP,ISTORE,EXIT 145 000914 146 000914 ;Z ,NONE -- append a null destination (Flashable) 147 000914 ; CELL IALLOT ; 148 000914 ; When compiling in Flash ROM a branch to be resolved later, we must 149 000914 ; skip the cell so that it can be programmed at a later time. 150 000914 ; In general Flash memory can only be written once! 151 000914 ; ,NONE should be used wherever !DEST will resolve the branch. 152 000914 HEADER COMMANONE,5,',NONE',DOCOLON 152.1 000000 PUBLIC COMMANONE 152.2 000914 .... DW link 152.3 000916 FF DB 0FFh ; not immediate 152.4 000917 link SET $ 152.5 000917 05 DB 5 152.6 000918 2C4E4F4E45 DB ',NONE' 152.7 00091D 00 EVEN 152.8 00091E IF 'DOCOLON'='DOCODE' 152.9 00091E COMMANONE: DW $+2 152.10 00091E ELSE 152.11 00091E .... COMMANONE: DW DOCOLON 152.12 000920 ENDIF 152.13 000920 ENDM 153 000920 ............ DW CELL,IALLOT,EXIT 154 000926 155 000926 ; ---------------------------------------------- ------------------------ 156 000926 ; HEADER STRUCTURE 157 000926 ; The structure of the Forth dictionary headers (name, link, immediate 158 000926 ; flag, and "smudge" bit) does not necessarily differ across CPUs. This 159 000926 ; structure is not easily factored into distinct "portable" words; 160 000926 ; instead, it is implicit in the definitions of FIND and CREATE, and 161 000926 ; also in NFA>LFA, NFA>CFA, IMMED?, IMMEDIATE, HIDE, and REVEAL. 162 000926 ; These words must be (substantially) rewritten if either the header 163 000926 ; structure or its inherent assumptions are changed. 164 000926 904 000926 #include "4e-hilvl430G2553.s43" 1 000926 ; ---------------------------------------------- ------------------------ 2 000926 ; 4e4th is a Forth based on CamelForth 3 000926 ; for the Texas Instruments MSP430 4 000926 ; 5 000926 ; This program is free software; you can redistribute it and/or modify 6 000926 ; it under the terms of the GNU General Public License as published by 7 000926 ; the Free Software Foundation; either version 3 of the License, or 8 000926 ; (at your option) any later version. 9 000926 ; 10 000926 ; This program is distributed in the hope that it will be useful, 11 000926 ; but WITHOUT ANY WARRANTY; without even the implied warranty of 12 000926 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 000926 ; GNU General Public License for more details. 14 000926 ; 15 000926 ; You should have received a copy of the GNU General Public License 16 000926 ; along with this program. If not, see . 17 000926 ; 18 000926 ; See LICENSE TERMS in Brads file readme.txt as well. 19 000926 20 000926 ; ---------------------------------------------- ------------------------ 21 000926 ; 4e-hilvl430G2553.s43 - High Level Words - MSP430G2553 22 000926 ; ---------------------------------------------- ------------------------ 23 000926 24 000926 ; Forth words are documented as follows: 25 000926 ;x NAME stack -- stack description 26 000926 ; where x=C for ANS Forth Core words, X for ANS 27 000926 ; Extensions, Z for internal or private words. 28 000926 ; ---------------------------------------------- ------------------------ 29 000926 ; REVISION HISTORY 30 000926 31 000926 ; 30 Mar 2012 mk fixed FM/MOD 32 000926 ; 26 Feb 2012 mk - adopted to MSP430G2553 33 000926 ; MEM ( -- n ) n = bytes left in flash 34 000926 ; FLASHEND constant MEMTOP 35 000926 ; FLASHSTART constant MEMBOT 36 000926 ; kernel at $E000, IDP = FLASHSTART = C000 37 000926 ; fixed backspace. 38 000926 ; ok promt at end of line. 39 000926 ; .S prints depth. 40 000926 ; 41 000926 ; 17 jan 09 bjr - changed label _DP to DDP for compatibility with token 42 000926 ; naming convention. Now uses DEST macro to compute branch offsets. 43 000926 ; 11 jan 09 bjr - modified QUIT for Xon/Xoff flow control 44 000926 ; 4 jan 09 bjr - created from Camel86h.asm. 45 000926 46 000926 ; SYSTEM VARIABLES & CONSTANTS ================= = 47 000926 48 000926 ;Z u0 -- a-addr current user area adrs 49 000926 ; 0 USER U0 50 000926 HEADER U0,2,'U0',DOUSER 50.1 000000 PUBLIC U0 50.2 000926 .... DW link 50.3 000928 FF DB 0FFh ; not immediate 50.4 000929 link SET $ 50.5 000929 02 DB 2 50.6 00092A 5530 DB 'U0' 50.7 00092C EVEN 50.8 00092C IF 'DOUSER'='DOCODE' 50.9 00092C U0: DW $+2 50.10 00092C ELSE 50.11 00092C .... U0: DW DOUSER 50.12 00092E ENDIF 50.13 00092E ENDM 51 00092E 0000 DW 0 52 000930 53 000930 ;C >IN -- a-addr holds offset into TIB 54 000930 ; 2 USER >IN 55 000930 HEADER TOIN,3,'>IN',DOUSER 55.1 000000 PUBLIC TOIN 55.2 000930 .... DW link 55.3 000932 FF DB 0FFh ; not immediate 55.4 000933 link SET $ 55.5 000933 03 DB 3 55.6 000934 3E494E DB '>IN' 55.7 000937 00 EVEN 55.8 000938 IF 'DOUSER'='DOCODE' 55.9 000938 TOIN: DW $+2 55.10 000938 ELSE 55.11 000938 .... TOIN: DW DOUSER 55.12 00093A ENDIF 55.13 00093A ENDM 56 00093A 0200 DW 2 57 00093C 58 00093C ;C BASE -- a-addr holds conversion radix 59 00093C ; 4 USER BASE 60 00093C HEADER BASE,4,'BASE',DOUSER 60.1 000000 PUBLIC BASE 60.2 00093C .... DW link 60.3 00093E FF DB 0FFh ; not immediate 60.4 00093F link SET $ 60.5 00093F 04 DB 4 60.6 000940 42415345 DB 'BASE' 60.7 000944 EVEN 60.8 000944 IF 'DOUSER'='DOCODE' 60.9 000944 BASE: DW $+2 60.10 000944 ELSE 60.11 000944 .... BASE: DW DOUSER 60.12 000946 ENDIF 60.13 000946 ENDM 61 000946 0400 DW 4 62 000948 63 000948 ;C STATE -- a-addr holds compiler state 64 000948 ; 6 USER STATE 65 000948 HEADER STATE,5,'STATE',DOUSER 65.1 000000 PUBLIC STATE 65.2 000948 .... DW link 65.3 00094A FF DB 0FFh ; not immediate 65.4 00094B link SET $ 65.5 00094B 05 DB 5 65.6 00094C 5354415445 DB 'STATE' 65.7 000951 00 EVEN 65.8 000952 IF 'DOUSER'='DOCODE' 65.9 000952 STATE: DW $+2 65.10 000952 ELSE 65.11 000952 .... STATE: DW DOUSER 65.12 000954 ENDIF 65.13 000954 ENDM 66 000954 0600 DW 6 67 000956 68 000956 ;Z dp -- a-addr holds dictionary ptr 69 000956 ; 8 USER DP 70 000956 HEADER DDP,2,'DP',DOUSER 70.1 000000 PUBLIC DDP 70.2 000956 .... DW link 70.3 000958 FF DB 0FFh ; not immediate 70.4 000959 link SET $ 70.5 000959 02 DB 2 70.6 00095A 4450 DB 'DP' 70.7 00095C EVEN 70.8 00095C IF 'DOUSER'='DOCODE' 70.9 00095C DDP: DW $+2 70.10 00095C ELSE 70.11 00095C .... DDP: DW DOUSER 70.12 00095E ENDIF 70.13 00095E ENDM 71 00095E 0800 DW 8 72 000960 73 000960 ;Z 'source -- a-addr two cells: len, adrs 74 000960 ; 10 USER 'SOURCE 75 000960 HEADER TICKSOURCE,7,'\'SOURCE',DOUSER 75.1 000000 PUBLIC TICKSOURCE 75.2 000960 .... DW link 75.3 000962 FF DB 0FFh ; not immediate 75.4 000963 link SET $ 75.5 000963 07 DB 7 75.6 000964 27534F555243* DB '\'SOURCE' 75.7 00096B 00 EVEN 75.8 00096C IF 'DOUSER'='DOCODE' 75.9 00096C TICKSOURCE: DW $+2 75.10 00096C ELSE 75.11 00096C .... TICKSOURCE: DW DOUSER 75.12 00096E ENDIF 75.13 00096E ENDM 76 00096E 0A00 DW 10 77 000970 78 000970 ;Z latest -- a-addr last word in dict. 79 000970 ; 14 USER LATEST 80 000970 HEADER LATEST,6,'LATEST',DOUSER 80.1 000000 PUBLIC LATEST 80.2 000970 .... DW link 80.3 000972 FF DB 0FFh ; not immediate 80.4 000973 link SET $ 80.5 000973 06 DB 6 80.6 000974 4C4154455354 DB 'LATEST' 80.7 00097A EVEN 80.8 00097A IF 'DOUSER'='DOCODE' 80.9 00097A LATEST: DW $+2 80.10 00097A ELSE 80.11 00097A .... LATEST: DW DOUSER 80.12 00097C ENDIF 80.13 00097C ENDM 81 00097C 0E00 DW 14 82 00097E 83 00097E ;Z hp -- a-addr HOLD pointer 84 00097E ; 16 USER HP 85 00097E HEADER HP,2,'HP',DOUSER 85.1 000000 PUBLIC HP 85.2 00097E .... DW link 85.3 000980 FF DB 0FFh ; not immediate 85.4 000981 link SET $ 85.5 000981 02 DB 2 85.6 000982 4850 DB 'HP' 85.7 000984 EVEN 85.8 000984 IF 'DOUSER'='DOCODE' 85.9 000984 HP: DW $+2 85.10 000984 ELSE 85.11 000984 .... HP: DW DOUSER 85.12 000986 ENDIF 85.13 000986 ENDM 86 000986 1000 DW 16 87 000988 88 000988 ;Z LP -- a-addr Leave-stack pointer 89 000988 ; 18 USER LP 90 000988 HEADER LP,2,'LP',DOUSER 90.1 000000 PUBLIC LP 90.2 000988 .... DW link 90.3 00098A FF DB 0FFh ; not immediate 90.4 00098B link SET $ 90.5 00098B 02 DB 2 90.6 00098C 4C50 DB 'LP' 90.7 00098E EVEN 90.8 00098E IF 'DOUSER'='DOCODE' 90.9 00098E LP: DW $+2 90.10 00098E ELSE 90.11 00098E .... LP: DW DOUSER 90.12 000990 ENDIF 90.13 000990 ENDM 91 000990 1200 DW 18 92 000992 93 000992 ;Z IDP -- a-addr ROM dictionary pointer 94 000992 ; 20 USER IDP 95 000992 HEADER IDP,3,'IDP',DOUSER 95.1 000000 PUBLIC IDP 95.2 000992 .... DW link 95.3 000994 FF DB 0FFh ; not immediate 95.4 000995 link SET $ 95.5 000995 03 DB 3 95.6 000996 494450 DB 'IDP' 95.7 000999 00 EVEN 95.8 00099A IF 'DOUSER'='DOCODE' 95.9 00099A IDP: DW $+2 95.10 00099A ELSE 95.11 00099A .... IDP: DW DOUSER 95.12 00099C ENDIF 95.13 00099C ENDM 96 00099C 1400 DW 20 97 00099E 98 00099E ;Z NEWEST -- a-addr temporary LATEST storage 99 00099E ; 22 USER NEWEST 100 00099E HEADER NEWEST,6,'NEWEST',DOUSER 100.1 000000 PUBLIC NEWEST 100.2 00099E .... DW link 100.3 0009A0 FF DB 0FFh ; not immediate 100.4 0009A1 link SET $ 100.5 0009A1 06 DB 6 100.6 0009A2 4E4557455354 DB 'NEWEST' 100.7 0009A8 EVEN 100.8 0009A8 IF 'DOUSER'='DOCODE' 100.9 0009A8 NEWEST: DW $+2 100.10 0009A8 ELSE 100.11 0009A8 .... NEWEST: DW DOUSER 100.12 0009AA ENDIF 100.13 0009AA ENDM 101 0009AA 1600 DW 22 102 0009AC 103 0009AC ;Z APP -- a-addr xt of app ( was TURNKEY) 104 0009AC ; 24 USER APP 105 0009AC HEADER APP,3,'APP',DOUSER 105.1 000000 PUBLIC APP 105.2 0009AC .... DW link 105.3 0009AE FF DB 0FFh ; not immediate 105.4 0009AF link SET $ 105.5 0009AF 03 DB 3 105.6 0009B0 415050 DB 'APP' 105.7 0009B3 00 EVEN 105.8 0009B4 IF 'DOUSER'='DOCODE' 105.9 0009B4 APP: DW $+2 105.10 0009B4 ELSE 105.11 0009B4 .... APP: DW DOUSER 105.12 0009B6 ENDIF 105.13 0009B6 ENDM 106 0009B6 1800 DW 24 107 0009B8 108 0009B8 ;Z CAPS -- a-addr capitalize words 109 0009B8 ; 26 USER CAPS 110 0009B8 HEADER CAPS,4,'CAPS',DOUSER 110.1 000000 PUBLIC CAPS 110.2 0009B8 .... DW link 110.3 0009BA FF DB 0FFh ; not immediate 110.4 0009BB link SET $ 110.5 0009BB 04 DB 4 110.6 0009BC 43415053 DB 'CAPS' 110.7 0009C0 EVEN 110.8 0009C0 IF 'DOUSER'='DOCODE' 110.9 0009C0 CAPS: DW $+2 110.10 0009C0 ELSE 110.11 0009C0 .... CAPS: DW DOUSER 110.12 0009C2 ENDIF 110.13 0009C2 ENDM 111 0009C2 1A00 DW 26 112 0009C4 113 0009C4 ; user variables 28,30 tbd 114 0009C4 115 0009C4 ;X PAD -- a-addr user PAD buffer 116 0009C4 ; = end of hold area! 117 0009C4 HEADER PAD,3,'PAD',DOUSER 117.1 000000 PUBLIC PAD 117.2 0009C4 .... DW link 117.3 0009C6 FF DB 0FFh ; not immediate 117.4 0009C7 link SET $ 117.5 0009C7 03 DB 3 117.6 0009C8 504144 DB 'PAD' 117.7 0009CB 00 EVEN 117.8 0009CC IF 'DOUSER'='DOCODE' 117.9 0009CC PAD: DW $+2 117.10 0009CC ELSE 117.11 0009CC .... PAD: DW DOUSER 117.12 0009CE ENDIF 117.13 0009CE ENDM 118 0009CE .... DW PADAREA-UAREA 119 0009D0 120 0009D0 ;Z l0 -- a-addr bottom of Leave stack 121 0009D0 HEADER L0,2,'L0',DOUSER 121.1 000000 PUBLIC L0 121.2 0009D0 .... DW link 121.3 0009D2 FF DB 0FFh ; not immediate 121.4 0009D3 link SET $ 121.5 0009D3 02 DB 2 121.6 0009D4 4C30 DB 'L0' 121.7 0009D6 EVEN 121.8 0009D6 IF 'DOUSER'='DOCODE' 121.9 0009D6 L0: DW $+2 121.10 0009D6 ELSE 121.11 0009D6 .... L0: DW DOUSER 121.12 0009D8 ENDIF 121.13 0009D8 ENDM 122 0009D8 .... DW LSTACK-UAREA 123 0009DA 124 0009DA ;Z r0 -- a-addr end of return stack 125 0009DA HEADER RZERO,2,'R0',DOUSER 125.1 000000 PUBLIC RZERO 125.2 0009DA .... DW link 125.3 0009DC FF DB 0FFh ; not immediate 125.4 0009DD link SET $ 125.5 0009DD 02 DB 2 125.6 0009DE 5230 DB 'R0' 125.7 0009E0 EVEN 125.8 0009E0 IF 'DOUSER'='DOCODE' 125.9 0009E0 RZERO: DW $+2 125.10 0009E0 ELSE 125.11 0009E0 .... RZERO: DW DOUSER 125.12 0009E2 ENDIF 125.13 0009E2 ENDM 126 0009E2 .... DW RSTACK-UAREA 127 0009E4 128 0009E4 ;Z s0 -- a-addr end of parameter stack 129 0009E4 HEADER S0,2,'S0',DOUSER 129.1 000000 PUBLIC S0 129.2 0009E4 .... DW link 129.3 0009E6 FF DB 0FFh ; not immediate 129.4 0009E7 link SET $ 129.5 0009E7 02 DB 2 129.6 0009E8 5330 DB 'S0' 129.7 0009EA EVEN 129.8 0009EA IF 'DOUSER'='DOCODE' 129.9 0009EA S0: DW $+2 129.10 0009EA ELSE 129.11 0009EA .... S0: DW DOUSER 129.12 0009EC ENDIF 129.13 0009EC ENDM 130 0009EC .... DW PSTACK-UAREA 131 0009EE 132 0009EE ;X tib -- a-addr Terminal Input Buffer 133 0009EE ; HEX 80 USER TIB 8086: above user area 134 0009EE HEADER TIB,3,'TIB',DOUSER 134.1 000000 PUBLIC TIB 134.2 0009EE .... DW link 134.3 0009F0 FF DB 0FFh ; not immediate 134.4 0009F1 link SET $ 134.5 0009F1 03 DB 3 134.6 0009F2 544942 DB 'TIB' 134.7 0009F5 00 EVEN 134.8 0009F6 IF 'DOUSER'='DOCODE' 134.9 0009F6 TIB: DW $+2 134.10 0009F6 ELSE 134.11 0009F6 .... TIB: DW DOUSER 134.12 0009F8 ENDIF 134.13 0009F8 ENDM 135 0009F8 .... DW TIBAREA-UAREA 136 0009FA 137 0009FA ;Z tibsize -- n size of TIB 138 0009FA HEADER TIBSIZE,7,'TIBSIZE',DOCON 138.1 000000 PUBLIC TIBSIZE 138.2 0009FA .... DW link 138.3 0009FC FF DB 0FFh ; not immediate 138.4 0009FD link SET $ 138.5 0009FD 07 DB 7 138.6 0009FE 54494253495A* DB 'TIBSIZE' 138.7 000A05 00 EVEN 138.8 000A06 IF 'DOCON'='DOCODE' 138.9 000A06 TIBSIZE: DW $+2 138.10 000A06 ELSE 138.11 000A06 .... TIBSIZE: DW DOCON 138.12 000A08 ENDIF 138.13 000A08 ENDM 139 000A08 .... DW TIB_SIZE-2 ; 2 chars safety zone 140 000A0A 141 000A0A ;C BL -- char an ASCII space 142 000A0A HEADER BLANK,2,'BL',DOCON 142.1 000000 PUBLIC BLANK 142.2 000A0A .... DW link 142.3 000A0C FF DB 0FFh ; not immediate 142.4 000A0D link SET $ 142.5 000A0D 02 DB 2 142.6 000A0E 424C DB 'BL' 142.7 000A10 EVEN 142.8 000A10 IF 'DOCON'='DOCODE' 142.9 000A10 BLANK: DW $+2 142.10 000A10 ELSE 142.11 000A10 .... BLANK: DW DOCON 142.12 000A12 ENDIF 142.13 000A12 ENDM 143 000A12 2000 DW 20h 144 000A14 145 000A14 ;Z uinit -- addr initial values for user area 146 000A14 ; MSP430: we also use this to initialize the RAM interrupt 147 000A14 ; vectors, which immediately follow the user area. 148 000A14 ; Per init430f1611.s43, allocate 16 cells for user 149 000A14 ; variables, followed by 30 cells for interrupt vectors. 150 000A14 HEADER UINIT,5,'UINIT',DOROM 150.1 000000 PUBLIC UINIT 150.2 000A14 .... DW link 150.3 000A16 FF DB 0FFh ; not immediate 150.4 000A17 link SET $ 150.5 000A17 05 DB 5 150.6 000A18 55494E4954 DB 'UINIT' 150.7 000A1D 00 EVEN 150.8 000A1E IF 'DOROM'='DOCODE' 150.9 000A1E UINIT: DW $+2 150.10 000A1E ELSE 150.11 000A1E .... UINIT: DW DOROM 150.12 000A20 ENDIF 150.13 000A20 ENDM 151 000A20 000000000A00* DW 0,0,10,0 ; reserved,>IN,BASE,STAT E ; start in HEX mk 152 000A28 .... DW RAMDICT ; DP 153 000A2A 00000000 DW 0,0 ; SOURCE init'd elsewhere 154 000A2E .... DW lastword ; LATEST 155 000A30 00000000 DW 0,0 ; HP,LP init'd elsewhere 156 000A34 00C0 DW FLASHSTART ; IDP 157 000A36 0000 DW 0 ; NEWEST not init'd 158 000A38 .... DW DOTCOLD ; app 159 000A3A FFFF DW -1 ; CAPS on 160 000A3C 00000000 DW 0,0 ; user variables TBD 161 000A40 162 000A40 /* not there mk 163 000A40 ; RAM interrupt vectors, 15 vectors of 2 cells each 164 000A40 MOV #nullirq,PC 165 000A40 MOV #nullirq,PC 166 000A40 MOV #nullirq,PC 167 000A40 MOV #nullirq,PC 168 000A40 MOV #nullirq,PC 169 000A40 MOV #nullirq,PC 170 000A40 MOV #nullirq,PC 171 000A40 MOV #nullirq,PC 172 000A40 MOV #nullirq,PC 173 000A40 MOV #nullirq,PC 174 000A40 MOV #nullirq,PC 175 000A40 MOV #nullirq,PC 176 000A40 MOV #nullirq,PC 177 000A40 MOV #nullirq,PC 178 000A40 MOV #nullirq,PC 179 000A40 */ 180 000A40 181 000A40 ;Z #init -- n #bytes of user area init data 182 000A40 HEADER NINIT,5,'#INIT',DOCON 182.1 000000 PUBLIC NINIT 182.2 000A40 .... DW link 182.3 000A42 FF DB 0FFh ; not immediate 182.4 000A43 link SET $ 182.5 000A43 05 DB 5 182.6 000A44 23494E4954 DB '#INIT' 182.7 000A49 00 EVEN 182.8 000A4A IF 'DOCON'='DOCODE' 182.9 000A4A NINIT: DW $+2 182.10 000A4A ELSE 182.11 000A4A .... NINIT: DW DOCON 182.12 000A4C ENDIF 182.13 000A4C ENDM 183 000A4C .... DW (UAREA_SIZE)*2 ; SIZEs given in cells 184 000A4E 185 000A4E 186 000000 EXTERN cor,infoB,AppU0 187 000A4E ;Z COR -- adr cause of reset 188 000A4E HEADER COR,3,'COR',DOCON 188.1 000000 PUBLIC COR 188.2 000A4E .... DW link 188.3 000A50 FF DB 0FFh ; not immediate 188.4 000A51 link SET $ 188.5 000A51 03 DB 3 188.6 000A52 434F52 DB 'COR' 188.7 000A55 00 EVEN 188.8 000A56 IF 'DOCON'='DOCODE' 188.9 000A56 COR: DW $+2 188.10 000A56 ELSE 188.11 000A56 .... COR: DW DOCON 188.12 000A58 ENDIF 188.13 000A58 ENDM 189 000A58 .... DW cor 190 000A5A 191 000A5A ;Z INFOB -- adr start of info B segment 192 000A5A HEADER INFOB,5,'INFOB',DOCON 192.1 000000 PUBLIC INFOB 192.2 000A5A .... DW link 192.3 000A5C FF DB 0FFh ; not immediate 192.4 000A5D link SET $ 192.5 000A5D 05 DB 5 192.6 000A5E 494E464F42 DB 'INFOB' 192.7 000A63 00 EVEN 192.8 000A64 IF 'DOCON'='DOCODE' 192.9 000A64 INFOB: DW $+2 192.10 000A64 ELSE 192.11 000A64 .... INFOB: DW DOCON 192.12 000A66 ENDIF 192.13 000A66 ENDM 193 000A66 .... DW infoB 194 000A68 195 000A68 ;Z APPU0 -- adr start of Application user area 196 000A68 HEADER APPU0,5,'APPU0',DOCON 196.1 000000 PUBLIC APPU0 196.2 000A68 .... DW link 196.3 000A6A FF DB 0FFh ; not immediate 196.4 000A6B link SET $ 196.5 000A6B 05 DB 5 196.6 000A6C 4150505530 DB 'APPU0' 196.7 000A71 00 EVEN 196.8 000A72 IF 'DOCON'='DOCODE' 196.9 000A72 APPU0: DW $+2 196.10 000A72 ELSE 196.11 000A72 .... APPU0: DW DOCON 196.12 000A74 ENDIF 196.13 000A74 ENDM 197 000A74 .... DW AppU0 198 000A76 199 000A76 200 000A76 ; ARITHMETIC OPERATORS ========================= = 201 000A76 202 000A76 ;C S>D n -- d single -> double prec. 203 000A76 ; DUP 0< ; 204 000A76 HEADER STOD,3,'S>D',DOCOLON 204.1 000000 PUBLIC STOD 204.2 000A76 .... DW link 204.3 000A78 FF DB 0FFh ; not immediate 204.4 000A79 link SET $ 204.5 000A79 03 DB 3 204.6 000A7A 533E44 DB 'S>D' 204.7 000A7D 00 EVEN 204.8 000A7E IF 'DOCOLON'='DOCODE' 204.9 000A7E STOD: DW $+2 204.10 000A7E ELSE 204.11 000A7E .... STOD: DW DOCOLON 204.12 000A80 ENDIF 204.13 000A80 ENDM 205 000A80 ............ DW DUP,ZEROLESS,EXIT 206 000A86 207 000A86 ;Z ?NEGATE n1 n2 -- n3 negate n1 if n2 negative 208 000A86 ; 0< IF NEGATE THEN ; ...a common factor 209 000A86 HEADER QNEGATE,7,'?NEGATE',DOCOLON 209.1 000000 PUBLIC QNEGATE 209.2 000A86 .... DW link 209.3 000A88 FF DB 0FFh ; not immediate 209.4 000A89 link SET $ 209.5 000A89 07 DB 7 209.6 000A8A 3F4E45474154* DB '?NEGATE' 209.7 000A91 00 EVEN 209.8 000A92 IF 'DOCOLON'='DOCODE' 209.9 000A92 QNEGATE: DW $+2 209.10 000A92 ELSE 209.11 000A92 .... QNEGATE: DW DOCOLON 209.12 000A94 ENDIF 209.13 000A94 ENDM 210 000A94 ........ DW ZEROLESS,qbran 211 000A98 DEST QNEG1 211.1 000A98 0400 DW QNEG1-$ 211.2 000A9A ENDM 212 000A9A .... DW NEGATE 213 000A9C .... QNEG1: DW EXIT 214 000A9E 215 000A9E ;C ABS n1 -- +n2 absolute value 216 000A9E ; DUP ?NEGATE ; 217 000A9E HEADER ABBS,3,'ABS',DOCOLON 217.1 000000 PUBLIC ABBS 217.2 000A9E .... DW link 217.3 000AA0 FF DB 0FFh ; not immediate 217.4 000AA1 link SET $ 217.5 000AA1 03 DB 3 217.6 000AA2 414253 DB 'ABS' 217.7 000AA5 00 EVEN 217.8 000AA6 IF 'DOCOLON'='DOCODE' 217.9 000AA6 ABBS: DW $+2 217.10 000AA6 ELSE 217.11 000AA6 .... ABBS: DW DOCOLON 217.12 000AA8 ENDIF 217.13 000AA8 ENDM 218 000AA8 ............ DW DUP,QNEGATE,EXIT 219 000AAE 220 000AAE ;X DNEGATE d1 -- d2 negate double precision 221 000AAE ; SWAP INVERT SWAP INVERT 1 M+ ; 222 000AAE HEADER DNEGATE,7,'DNEGATE',DOCOLON 222.1 000000 PUBLIC DNEGATE 222.2 000AAE .... DW link 222.3 000AB0 FF DB 0FFh ; not immediate 222.4 000AB1 link SET $ 222.5 000AB1 07 DB 7 222.6 000AB2 444E45474154* DB 'DNEGATE' 222.7 000AB9 00 EVEN 222.8 000ABA IF 'DOCOLON'='DOCODE' 222.9 000ABA DNEGATE: DW $+2 222.10 000ABA ELSE 222.11 000ABA .... DNEGATE: DW DOCOLON 222.12 000ABC ENDIF 222.13 000ABC ENDM 223 000ABC ............* DW SWAP,INVERT,SWAP,INVERT,lit,1,MPLUS 224 000ACA .... DW EXIT 225 000ACC 226 000ACC ;Z ?DNEGATE d1 n -- d2 negate d1 if n negative 227 000ACC ; 0< IF DNEGATE THEN ; ...a common factor 228 000ACC HEADER QDNEGATE,8,'?DNEGATE',DOCOLON 228.1 000000 PUBLIC QDNEGATE 228.2 000ACC .... DW link 228.3 000ACE FF DB 0FFh ; not immediate 228.4 000ACF link SET $ 228.5 000ACF 08 DB 8 228.6 000AD0 3F444E454741* DB '?DNEGATE' 228.7 000AD8 EVEN 228.8 000AD8 IF 'DOCOLON'='DOCODE' 228.9 000AD8 QDNEGATE: DW $+2 228.10 000AD8 ELSE 228.11 000AD8 .... QDNEGATE: DW DOCOLON 228.12 000ADA ENDIF 228.13 000ADA ENDM 229 000ADA ........ DW ZEROLESS,qbran 230 000ADE DEST DNEG1 230.1 000ADE 0400 DW DNEG1-$ 230.2 000AE0 ENDM 231 000AE0 .... DW DNEGATE 232 000AE2 .... DNEG1: DW EXIT 233 000AE4 234 000AE4 ;X DABS d1 -- +d2 absolute value dbl.prec. 235 000AE4 ; DUP ?DNEGATE ; 236 000AE4 HEADER DABS,4,'DABS',DOCOLON 236.1 000000 PUBLIC DABS 236.2 000AE4 .... DW link 236.3 000AE6 FF DB 0FFh ; not immediate 236.4 000AE7 link SET $ 236.5 000AE7 04 DB 4 236.6 000AE8 44414253 DB 'DABS' 236.7 000AEC EVEN 236.8 000AEC IF 'DOCOLON'='DOCODE' 236.9 000AEC DABS: DW $+2 236.10 000AEC ELSE 236.11 000AEC .... DABS: DW DOCOLON 236.12 000AEE ENDIF 236.13 000AEE ENDM 237 000AEE ............ DW DUP,QDNEGATE,EXIT 238 000AF4 239 000AF4 ;C M* n1 n2 -- d signed 16*16->32 multiply 240 000AF4 ; 2DUP XOR >R carries sign of the result 241 000AF4 ; SWAP ABS SWAP ABS UM* 242 000AF4 ; R> ?DNEGATE ; 243 000AF4 HEADER MSTAR,2,'M*',DOCOLON 243.1 000000 PUBLIC MSTAR 243.2 000AF4 .... DW link 243.3 000AF6 FF DB 0FFh ; not immediate 243.4 000AF7 link SET $ 243.5 000AF7 02 DB 2 243.6 000AF8 4D2A DB 'M*' 243.7 000AFA EVEN 243.8 000AFA IF 'DOCOLON'='DOCODE' 243.9 000AFA MSTAR: DW $+2 243.10 000AFA ELSE 243.11 000AFA .... MSTAR: DW DOCOLON 243.12 000AFC ENDIF 243.13 000AFC ENDM 244 000AFC ............ DW TWODUP,XORR,TOR 245 000B02 ............* DW SWAP,ABBS,SWAP,ABBS,UMSTAR 246 000B0C ............ DW RFROM,QDNEGATE,EXIT 247 000B12 248 000B12 ;C SM/REM d1 n1 -- n2 n3 symmetric signed div 249 000B12 ; 2DUP XOR >R sign of quotient 250 000B12 ; OVER >R sign of remainder 251 000B12 ; ABS >R DABS R> UM/MOD 252 000B12 ; SWAP R> ?NEGATE 253 000B12 ; SWAP R> ?NEGATE ; 254 000B12 ; Ref. dpANS-6 section 3.2.2.1. 255 000B12 HEADER SMSLASHREM,6,'SM/REM',DOCOLON 255.1 000000 PUBLIC SMSLASHREM 255.2 000B12 .... DW link 255.3 000B14 FF DB 0FFh ; not immediate 255.4 000B15 link SET $ 255.5 000B15 06 DB 6 255.6 000B16 534D2F52454D DB 'SM/REM' 255.7 000B1C EVEN 255.8 000B1C IF 'DOCOLON'='DOCODE' 255.9 000B1C SMSLASHREM: DW $+2 255.10 000B1C ELSE 255.11 000B1C .... SMSLASHREM: DW DOCOLON 255.12 000B1E ENDIF 255.13 000B1E ENDM 256 000B1E ............* DW TWODUP,XORR,TOR,OVER,TOR 257 000B28 ............* DW ABBS,TOR,DABS,RFROM,UMSLASHMOD 258 000B32 ............* DW SWAP,RFROM,QNEGATE,SWAP,RFROM,QNEGATE 259 000B3E .... DW EXIT 260 000B40 261 000B40 ;C FM/MOD d1 n1 -- n2 n3 floored signed div'n 262 000B40 ; Ching-Tang Tseng Mar 24 2012 263 000B40 ; DUP >R OVER OVER XOR >R 264 000B40 ; SM/REM 265 000B40 ; OVER R> 0< AND 266 000B40 ; IF SWAP R@ + SWAP 1 - 267 000B40 ; THEN R> DROP ; 268 000B40 ; 1 0 2 FM/MOD(OK) . . 0 1 ok 269 000B40 ; 7 0 9 FM/MOD(OK) . . 0 7 ok 270 000B40 ; Ref. dpANS-6 section 3.2.2.1. 271 000B40 HEADER FMSLASHMOD,6,'FM/MOD',DOCOLON 271.1 000000 PUBLIC FMSLASHMOD 271.2 000B40 .... DW link 271.3 000B42 FF DB 0FFh ; not immediate 271.4 000B43 link SET $ 271.5 000B43 06 DB 6 271.6 000B44 464D2F4D4F44 DB 'FM/MOD' 271.7 000B4A EVEN 271.8 000B4A IF 'DOCOLON'='DOCODE' 271.9 000B4A FMSLASHMOD: DW $+2 271.10 000B4A ELSE 271.11 000B4A .... FMSLASHMOD: DW DOCOLON 271.12 000B4C ENDIF 271.13 000B4C ENDM 272 000B4C ............* DW DUP,TOR,OVER,OVER,XORR,TOR 273 000B58 .... DW SMSLASHREM 274 000B5A ............* DW OVER,RFROM,ZEROLESS,ANDD,qbran 275 000B64 DEST FMMOD1 275.1 000B64 0C00 DW FMMOD1-$ 275.2 000B66 ENDM 276 000B66 ............* DW SWAP,RFETCH,PLUS,SWAP,ONEMINUS 277 000B70 ............ FMMOD1: DW RFROM,DROP,EXIT 278 000B76 279 000B76 ;C * n1 n2 -- n3 signed multiply 280 000B76 ; M* DROP ; 281 000B76 HEADER STAR,1,'*',DOCOLON 281.1 000000 PUBLIC STAR 281.2 000B76 .... DW link 281.3 000B78 FF DB 0FFh ; not immediate 281.4 000B79 link SET $ 281.5 000B79 01 DB 1 281.6 000B7A 2A DB '*' 281.7 000B7B 00 EVEN 281.8 000B7C IF 'DOCOLON'='DOCODE' 281.9 000B7C STAR: DW $+2 281.10 000B7C ELSE 281.11 000B7C .... STAR: DW DOCOLON 281.12 000B7E ENDIF 281.13 000B7E ENDM 282 000B7E ............ DW MSTAR,DROP,EXIT 283 000B84 284 000B84 ;C /MOD n1 n2 -- n3 n4 signed divide/rem'dr 285 000B84 ; >R S>D R> FM/MOD ; 286 000B84 HEADER SLASHMOD,4,'/MOD',DOCOLON 286.1 000000 PUBLIC SLASHMOD 286.2 000B84 .... DW link 286.3 000B86 FF DB 0FFh ; not immediate 286.4 000B87 link SET $ 286.5 000B87 04 DB 4 286.6 000B88 2F4D4F44 DB '/MOD' 286.7 000B8C EVEN 286.8 000B8C IF 'DOCOLON'='DOCODE' 286.9 000B8C SLASHMOD: DW $+2 286.10 000B8C ELSE 286.11 000B8C .... SLASHMOD: DW DOCOLON 286.12 000B8E ENDIF 286.13 000B8E ENDM 287 000B8E ............* DW TOR,STOD,RFROM,FMSLASHMOD,EXIT 288 000B98 289 000B98 ;C / n1 n2 -- n3 signed divide 290 000B98 ; /MOD nip ; 291 000B98 HEADER SLASH,1,'/',DOCOLON 291.1 000000 PUBLIC SLASH 291.2 000B98 .... DW link 291.3 000B9A FF DB 0FFh ; not immediate 291.4 000B9B link SET $ 291.5 000B9B 01 DB 1 291.6 000B9C 2F DB '/' 291.7 000B9D 00 EVEN 291.8 000B9E IF 'DOCOLON'='DOCODE' 291.9 000B9E SLASH: DW $+2 291.10 000B9E ELSE 291.11 000B9E .... SLASH: DW DOCOLON 291.12 000BA0 ENDIF 291.13 000BA0 ENDM 292 000BA0 ............ DW SLASHMOD,NIP,EXIT 293 000BA6 294 000BA6 ;C MOD n1 n2 -- n3 signed remainder 295 000BA6 ; /MOD DROP ; 296 000BA6 HEADER MODD,3,'MOD',DOCOLON 296.1 000000 PUBLIC MODD 296.2 000BA6 .... DW link 296.3 000BA8 FF DB 0FFh ; not immediate 296.4 000BA9 link SET $ 296.5 000BA9 03 DB 3 296.6 000BAA 4D4F44 DB 'MOD' 296.7 000BAD 00 EVEN 296.8 000BAE IF 'DOCOLON'='DOCODE' 296.9 000BAE MODD: DW $+2 296.10 000BAE ELSE 296.11 000BAE .... MODD: DW DOCOLON 296.12 000BB0 ENDIF 296.13 000BB0 ENDM 297 000BB0 ............ DW SLASHMOD,DROP,EXIT 298 000BB6 299 000BB6 ;C */MOD n1 n2 n3 -- n4 n5 n1*n2/n3, rem" 300 000BB6 ; >R M* R> FM/MOD ; 301 000BB6 HEADER SSMOD,5,'*/MOD',DOCOLON 301.1 000000 PUBLIC SSMOD 301.2 000BB6 .... DW link 301.3 000BB8 FF DB 0FFh ; not immediate 301.4 000BB9 link SET $ 301.5 000BB9 05 DB 5 301.6 000BBA 2A2F4D4F44 DB '*/MOD' 301.7 000BBF 00 EVEN 301.8 000BC0 IF 'DOCOLON'='DOCODE' 301.9 000BC0 SSMOD: DW $+2 301.10 000BC0 ELSE 301.11 000BC0 .... SSMOD: DW DOCOLON 301.12 000BC2 ENDIF 301.13 000BC2 ENDM 302 000BC2 ............* DW TOR,MSTAR,RFROM,FMSLASHMOD,EXIT 303 000BCC 304 000BCC ;C */ n1 n2 n3 -- n4 n1*n2/n3 305 000BCC ; */MOD nip ; 306 000BCC HEADER STARSLASH,2,'*/',DOCOLON 306.1 000000 PUBLIC STARSLASH 306.2 000BCC .... DW link 306.3 000BCE FF DB 0FFh ; not immediate 306.4 000BCF link SET $ 306.5 000BCF 02 DB 2 306.6 000BD0 2A2F DB '*/' 306.7 000BD2 EVEN 306.8 000BD2 IF 'DOCOLON'='DOCODE' 306.9 000BD2 STARSLASH: DW $+2 306.10 000BD2 ELSE 306.11 000BD2 .... STARSLASH: DW DOCOLON 306.12 000BD4 ENDIF 306.13 000BD4 ENDM 307 000BD4 ............ DW SSMOD,NIP,EXIT 308 000BDA 309 000BDA ;C MAX n1 n2 -- n3 signed maximum 310 000BDA ; 2DUP < IF SWAP THEN DROP ; 311 000BDA HEADER MAX,3,'MAX',DOCOLON 311.1 000000 PUBLIC MAX 311.2 000BDA .... DW link 311.3 000BDC FF DB 0FFh ; not immediate 311.4 000BDD link SET $ 311.5 000BDD 03 DB 3 311.6 000BDE 4D4158 DB 'MAX' 311.7 000BE1 00 EVEN 311.8 000BE2 IF 'DOCOLON'='DOCODE' 311.9 000BE2 MAX: DW $+2 311.10 000BE2 ELSE 311.11 000BE2 .... MAX: DW DOCOLON 311.12 000BE4 ENDIF 311.13 000BE4 ENDM 312 000BE4 ............ DW TWODUP,LESS,qbran 313 000BEA DEST MAX1 313.1 000BEA 0400 DW MAX1-$ 313.2 000BEC ENDM 314 000BEC .... DW SWAP 315 000BEE ........ MAX1: DW DROP,EXIT 316 000BF2 317 000BF2 ;C MIN n1 n2 -- n3 signed minimum 318 000BF2 ; 2DUP > IF SWAP THEN DROP ; 319 000BF2 HEADER MIN,3,'MIN',DOCOLON 319.1 000000 PUBLIC MIN 319.2 000BF2 .... DW link 319.3 000BF4 FF DB 0FFh ; not immediate 319.4 000BF5 link SET $ 319.5 000BF5 03 DB 3 319.6 000BF6 4D494E DB 'MIN' 319.7 000BF9 00 EVEN 319.8 000BFA IF 'DOCOLON'='DOCODE' 319.9 000BFA MIN: DW $+2 319.10 000BFA ELSE 319.11 000BFA .... MIN: DW DOCOLON 319.12 000BFC ENDIF 319.13 000BFC ENDM 320 000BFC ............ DW TWODUP,GREATER,qbran 321 000C02 DEST MIN1 321.1 000C02 0400 DW MIN1-$ 321.2 000C04 ENDM 322 000C04 .... DW SWAP 323 000C06 ........ MIN1: DW DROP,EXIT 324 000C0A 325 000C0A ; DOUBLE OPERATORS ============================= = 326 000C0A 327 000C0A ;C 2@ a-addr -- x1 x2 fetch 2 cells 328 000C0A ; DUP CELL+ @ SWAP @ ; 329 000C0A ; the lower address will appear on top of stack 330 000C0A HEADER TWOFETCH,2,'2@',DOCOLON 330.1 000000 PUBLIC TWOFETCH 330.2 000C0A .... DW link 330.3 000C0C FF DB 0FFh ; not immediate 330.4 000C0D link SET $ 330.5 000C0D 02 DB 2 330.6 000C0E 3240 DB '2@' 330.7 000C10 EVEN 330.8 000C10 IF 'DOCOLON'='DOCODE' 330.9 000C10 TWOFETCH: DW $+2 330.10 000C10 ELSE 330.11 000C10 .... TWOFETCH: DW DOCOLON 330.12 000C12 ENDIF 330.13 000C12 ENDM 331 000C12 ............* DW DUP,CELLPLUS,FETCH,SWAP,FETCH,EXIT 332 000C1E 333 000C1E ;C 2! x1 x2 a-addr -- store 2 cells 334 000C1E ; SWAP OVER ! CELL+ ! ; 335 000C1E ; the top of stack is stored at the lower adrs 336 000C1E HEADER TWOSTORE,2,'2!',DOCOLON 336.1 000000 PUBLIC TWOSTORE 336.2 000C1E .... DW link 336.3 000C20 FF DB 0FFh ; not immediate 336.4 000C21 link SET $ 336.5 000C21 02 DB 2 336.6 000C22 3221 DB '2!' 336.7 000C24 EVEN 336.8 000C24 IF 'DOCOLON'='DOCODE' 336.9 000C24 TWOSTORE: DW $+2 336.10 000C24 ELSE 336.11 000C24 .... TWOSTORE: DW DOCOLON 336.12 000C26 ENDIF 336.13 000C26 ENDM 337 000C26 ............* DW SWAP,OVER,STORE,CELLPLUS,STORE,EXIT 338 000C32 339 000C32 ;C 2DROP x1 x2 -- drop 2 cells 340 000C32 ; DROP DROP ; 341 000C32 HEADER TWODROP,5,'2DROP',DOCOLON 341.1 000000 PUBLIC TWODROP 341.2 000C32 .... DW link 341.3 000C34 FF DB 0FFh ; not immediate 341.4 000C35 link SET $ 341.5 000C35 05 DB 5 341.6 000C36 3244524F50 DB '2DROP' 341.7 000C3B 00 EVEN 341.8 000C3C IF 'DOCOLON'='DOCODE' 341.9 000C3C TWODROP: DW $+2 341.10 000C3C ELSE 341.11 000C3C .... TWODROP: DW DOCOLON 341.12 000C3E ENDIF 341.13 000C3E ENDM 342 000C3E ............ DW DROP,DROP,EXIT 343 000C44 344 000C44 ;C 2DUP x1 x2 -- x1 x2 x1 x2 dup top 2 cells 345 000C44 ; OVER OVER ; 346 000C44 HEADER TWODUP,4,'2DUP',DOCOLON 346.1 000000 PUBLIC TWODUP 346.2 000C44 .... DW link 346.3 000C46 FF DB 0FFh ; not immediate 346.4 000C47 link SET $ 346.5 000C47 04 DB 4 346.6 000C48 32445550 DB '2DUP' 346.7 000C4C EVEN 346.8 000C4C IF 'DOCOLON'='DOCODE' 346.9 000C4C TWODUP: DW $+2 346.10 000C4C ELSE 346.11 000C4C .... TWODUP: DW DOCOLON 346.12 000C4E ENDIF 346.13 000C4E ENDM 347 000C4E ............ DW OVER,OVER,EXIT 348 000C54 349 000C54 ;C 2SWAP x1 x2 x3 x4 -- x3 x4 x1 x2 per diagram 350 000C54 ; ROT >R ROT R> ; 351 000C54 HEADER TWOSWAP,5,'2SWAP',DOCOLON 351.1 000000 PUBLIC TWOSWAP 351.2 000C54 .... DW link 351.3 000C56 FF DB 0FFh ; not immediate 351.4 000C57 link SET $ 351.5 000C57 05 DB 5 351.6 000C58 3253574150 DB '2SWAP' 351.7 000C5D 00 EVEN 351.8 000C5E IF 'DOCOLON'='DOCODE' 351.9 000C5E TWOSWAP: DW $+2 351.10 000C5E ELSE 351.11 000C5E .... TWOSWAP: DW DOCOLON 351.12 000C60 ENDIF 351.13 000C60 ENDM 352 000C60 ............* DW ROT,TOR,ROT,RFROM,EXIT 353 000C6A 354 000C6A ;C 2OVER x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 355 000C6A ; >R >R 2DUP R> R> 2SWAP ; 356 000C6A HEADER TWOOVER,5,'2OVER',DOCOLON 356.1 000000 PUBLIC TWOOVER 356.2 000C6A .... DW link 356.3 000C6C FF DB 0FFh ; not immediate 356.4 000C6D link SET $ 356.5 000C6D 05 DB 5 356.6 000C6E 324F564552 DB '2OVER' 356.7 000C73 00 EVEN 356.8 000C74 IF 'DOCOLON'='DOCODE' 356.9 000C74 TWOOVER: DW $+2 356.10 000C74 ELSE 356.11 000C74 .... TWOOVER: DW DOCOLON 356.12 000C76 ENDIF 356.13 000C76 ENDM 357 000C76 ............* DW TOR,TOR,TWODUP,RFROM,RFROM 358 000C80 ........ DW TWOSWAP,EXIT 359 000C84 360 000C84 ; INPUT/OUTPUT ================================= = 361 000C84 362 000C84 ;C COUNT c-addr1 -- c-addr2 u counted->adr/le n 363 000C84 ; DUP CHAR+ SWAP C@ ; 364 000C84 HEADER COUNT,5,'COUNT',DOCOLON 364.1 000000 PUBLIC COUNT 364.2 000C84 .... DW link 364.3 000C86 FF DB 0FFh ; not immediate 364.4 000C87 link SET $ 364.5 000C87 05 DB 5 364.6 000C88 434F554E54 DB 'COUNT' 364.7 000C8D 00 EVEN 364.8 000C8E IF 'DOCOLON'='DOCODE' 364.9 000C8E COUNT: DW $+2 364.10 000C8E ELSE 364.11 000C8E .... COUNT: DW DOCOLON 364.12 000C90 ENDIF 364.13 000C90 ENDM 365 000C90 ............* DW DUP,CHARPLUS,SWAP,CFETCH,EXIT 366 000C9A 367 000C9A ;C CR -- output newline 368 000C9A ; 0D EMIT 0A EMIT ; 369 000C9A HEADER CR,2,'CR',DOCOLON 369.1 000000 PUBLIC CR 369.2 000C9A .... DW link 369.3 000C9C FF DB 0FFh ; not immediate 369.4 000C9D link SET $ 369.5 000C9D 02 DB 2 369.6 000C9E 4352 DB 'CR' 369.7 000CA0 EVEN 369.8 000CA0 IF 'DOCOLON'='DOCODE' 369.9 000CA0 CR: DW $+2 369.10 000CA0 ELSE 369.11 000CA0 .... CR: DW DOCOLON 369.12 000CA2 ENDIF 369.13 000CA2 ENDM 370 000CA2 ....0D00....* DW lit,0dh,EMIT,lit,0ah,EMIT,EXIT 371 000CB0 372 000CB0 ;C SPACE -- output a space 373 000CB0 ; BL EMIT ; 374 000CB0 HEADER SPACE,5,'SPACE',DOCOLON 374.1 000000 PUBLIC SPACE 374.2 000CB0 .... DW link 374.3 000CB2 FF DB 0FFh ; not immediate 374.4 000CB3 link SET $ 374.5 000CB3 05 DB 5 374.6 000CB4 5350414345 DB 'SPACE' 374.7 000CB9 00 EVEN 374.8 000CBA IF 'DOCOLON'='DOCODE' 374.9 000CBA SPACE: DW $+2 374.10 000CBA ELSE 374.11 000CBA .... SPACE: DW DOCOLON 374.12 000CBC ENDIF 374.13 000CBC ENDM 375 000CBC ............ DW BLANK,EMIT,EXIT 376 000CC2 377 000CC2 ;C SPACES n -- output n spaces 378 000CC2 ; BEGIN DUP WHILE SPACE 1- REPEAT DROP ; 379 000CC2 HEADER SPACES,6,'SPACES',DOCOLON 379.1 000000 PUBLIC SPACES 379.2 000CC2 .... DW link 379.3 000CC4 FF DB 0FFh ; not immediate 379.4 000CC5 link SET $ 379.5 000CC5 06 DB 6 379.6 000CC6 535041434553 DB 'SPACES' 379.7 000CCC EVEN 379.8 000CCC IF 'DOCOLON'='DOCODE' 379.9 000CCC SPACES: DW $+2 379.10 000CCC ELSE 379.11 000CCC .... SPACES: DW DOCOLON 379.12 000CCE ENDIF 379.13 000CCE ENDM 380 000CCE ........ SPCS1: DW DUP,qbran 381 000CD2 DEST SPCS2 381.1 000CD2 0A00 DW SPCS2-$ 381.2 000CD4 ENDM 382 000CD4 ............ DW SPACE,ONEMINUS,bran 383 000CDA DEST SPCS1 383.1 000CDA F4FF DW SPCS1-$ 383.2 000CDC ENDM 384 000CDC ........ SPCS2: DW DROP,EXIT 385 000CE0 386 000CE0 ;Z umin u1 u2 -- u unsigned minimum 387 000CE0 ; 2DUP U> IF SWAP THEN DROP ; 388 000CE0 HEADER UMIN,4,'UMIN',DOCOLON 388.1 000000 PUBLIC UMIN 388.2 000CE0 .... DW link 388.3 000CE2 FF DB 0FFh ; not immediate 388.4 000CE3 link SET $ 388.5 000CE3 04 DB 4 388.6 000CE4 554D494E DB 'UMIN' 388.7 000CE8 EVEN 388.8 000CE8 IF 'DOCOLON'='DOCODE' 388.9 000CE8 UMIN: DW $+2 388.10 000CE8 ELSE 388.11 000CE8 .... UMIN: DW DOCOLON 388.12 000CEA ENDIF 388.13 000CEA ENDM 389 000CEA ............ DW TWODUP,UGREATER,qbran 390 000CF0 DEST UMIN1 390.1 000CF0 0400 DW UMIN1-$ 390.2 000CF2 ENDM 391 000CF2 .... DW SWAP 392 000CF4 ........ UMIN1: DW DROP,EXIT 393 000CF8 394 000CF8 ;Z umax u1 u2 -- u unsigned maximum 395 000CF8 ; 2DUP U< IF SWAP THEN DROP ; 396 000CF8 HEADER UMAX,4,'UMAX',DOCOLON 396.1 000000 PUBLIC UMAX 396.2 000CF8 .... DW link 396.3 000CFA FF DB 0FFh ; not immediate 396.4 000CFB link SET $ 396.5 000CFB 04 DB 4 396.6 000CFC 554D4158 DB 'UMAX' 396.7 000D00 EVEN 396.8 000D00 IF 'DOCOLON'='DOCODE' 396.9 000D00 UMAX: DW $+2 396.10 000D00 ELSE 396.11 000D00 .... UMAX: DW DOCOLON 396.12 000D02 ENDIF 396.13 000D02 ENDM 397 000D02 ............ DW TWODUP,ULESS,qbran 398 000D08 DEST UMAX1 398.1 000D08 0400 DW UMAX1-$ 398.2 000D0A ENDM 399 000D0A .... DW SWAP 400 000D0C ........ UMAX1: DW DROP,EXIT 401 000D10 402 000D10 ;C ACCEPT c-addr +n -- +n' get line from term'l 403 000D10 ; OVER + 1- OVER -- sa ea a 404 000D10 ; BEGIN KEY -- sa ea a c 405 000D10 ; DUP 0D <> WHILE 406 000D10 ; DUP EMIT -- sa ea a c 407 000D10 ; DUP 8 = IF DROP 1- >R OVER R> UMAX 408 000D10 ; ELSE OVER C! 1+ OVER UMIN 409 000D10 ; THEN -- sa ea a 410 000D10 ; REPEAT -- sa ea a c 411 000D10 ; DROP NIP SWAP - ; 412 000D10 HEADER ACCEPT,6,'ACCEPT',DOCOLON 412.1 000000 PUBLIC ACCEPT 412.2 000D10 .... DW link 412.3 000D12 FF DB 0FFh ; not immediate 412.4 000D13 link SET $ 412.5 000D13 06 DB 6 412.6 000D14 414343455054 DB 'ACCEPT' 412.7 000D1A EVEN 412.8 000D1A IF 'DOCOLON'='DOCODE' 412.9 000D1A ACCEPT: DW $+2 412.10 000D1A ELSE 412.11 000D1A .... ACCEPT: DW DOCOLON 412.12 000D1C ENDIF 412.13 000D1C ENDM 413 000D1C ............* DW OVER,PLUS,ONEMINUS,OVER 414 000D24 ACC1: ; DW KEY,DUP,lit,0DH,NOTEQUAL,qbran 415 000D24 .... DW KEY 416 000D26 ........0D00* DW DUP,lit,0DH,NOTEQUAL ; ( -- c f ) CR 417 000D2E ; DW OVER,lit,0AH,NOTEQUAL ; ( -- c f f ) LF 418 000D2E ; DW ANDD 419 000D2E .... DW qbran 420 000D30 DEST ACC5 420.1 000D30 3800 DW ACC5-$ 420.2 000D32 ENDM 421 000D32 ........ DW DUP,EMIT 422 000D36 ; DW DUP,STORELEDS ; testing 423 000D36 ........0800* DW DUP,lit,8,EQUAL,qbran ;mk BS received? 424 000D40 DEST ACC3 424.1 000D40 1A00 DW ACC3-$ 424.2 000D42 ENDM 425 000D42 ............* DW DROP,ONEMINUS,TOR,OVER,RFROM,UMAX ;mk backspace handling 426 000D4E ........0800* DW SPACE,lit,8,EMIT ;mk $08 == BS (for tera term and hyterterminal) 427 000D56 .... DW bran 428 000D58 DEST ACC4 428.1 000D58 0C00 DW ACC4-$ 428.2 000D5A ENDM 429 000D5A ............*ACC3: DW OVER,CSTORE,ONEPLUS,OVER,UMIN 430 000D64 .... ACC4: DW bran 431 000D66 DEST ACC1 431.1 000D66 BEFF DW ACC1-$ 431.2 000D68 ENDM 432 000D68 ............*ACC5: DW DROP,NIP,SWAP,MINUS,EXIT 433 000D72 434 000D72 ;C TYPE c-addr +n -- type line to term'l 435 000D72 ; ?DUP IF 436 000D72 ; OVER + SWAP DO I C@ EMIT LOOP 437 000D72 ; ELSE DROP THEN ; 438 000D72 HEADER TYP,4,'TYPE',DOCOLON 438.1 000000 PUBLIC TYP 438.2 000D72 .... DW link 438.3 000D74 FF DB 0FFh ; not immediate 438.4 000D75 link SET $ 438.5 000D75 04 DB 4 438.6 000D76 54595045 DB 'TYPE' 438.7 000D7A EVEN 438.8 000D7A IF 'DOCOLON'='DOCODE' 438.9 000D7A TYP: DW $+2 438.10 000D7A ELSE 438.11 000D7A .... TYP: DW DOCOLON 438.12 000D7C ENDIF 438.13 000D7C ENDM 439 000D7C ........ DW QDUP,qbran 440 000D80 DEST TYP4 440.1 000D80 1800 DW TYP4-$ 440.2 000D82 ENDM 441 000D82 ............* DW OVER,PLUS,SWAP,xdo 442 000D8A ............*TYP3: DW II,CFETCH,EMIT,xloop 443 000D92 DEST TYP3 443.1 000D92 F8FF DW TYP3-$ 443.2 000D94 ENDM 444 000D94 .... DW bran 445 000D96 DEST TYP5 445.1 000D96 0400 DW TYP5-$ 445.2 000D98 ENDM 446 000D98 .... TYP4: DW DROP 447 000D9A .... TYP5: DW EXIT 448 000D9C 449 000D9C #define ITYPE TYP 450 000D9C #define ICOUNT COUNT 451 000D9C 452 000D9C ; HARVARD MODEL EXTENSIONS (split Code & Data) 453 000D9C 454 000D9C /* 455 000D9C ;Z ICOUNT c-addr1 -- c-addr2 u counted->adr/le n 456 000D9C ; DUP CHAR+ SWAP IC@ ; from Code space 457 000D9C HEADER ICOUNT,6,'ICOUNT',DOCOLON 458 000D9C DW DUP,CHARPLUS,SWAP,ICFETCH,EXIT 459 000D9C 460 000D9C ;Z ITYPE c-addr +n -- type line to term'l 461 000D9C ; ?DUP IF from Code space 462 000D9C ; OVER + SWAP DO I IC@ EMIT LOOP 463 000D9C ; ELSE DROP THEN ; 464 000D9C HEADER ITYPE,5,'ITYPE',DOCOLON 465 000D9C DW QDUP,qbran 466 000D9C DEST ITYP4 467 000D9C DW OVER,PLUS,SWAP,xdo 468 000D9C ITYP3: DW II,ICFETCH,EMIT,xloop 469 000D9C DEST ITYP3 470 000D9C DW bran 471 000D9C DEST ITYP5 472 000D9C ITYP4: DW DROP 473 000D9C ITYP5: DW EXIT 474 000D9C */ 475 000D9C 476 000D9C 477 000D9C ;Z (IS") -- c-addr u run-time code for S" 478 000D9C ; R> ICOUNT 2DUP + ALIGNED >R ; 479 000D9C ; Harvard model, for string stored in Code space 480 000D9C ; e.g. as used by ." 481 000D9C HEADER XISQUOTE,5,'(IS")',DOCOLON 481.1 000000 PUBLIC XISQUOTE 481.2 000D9C .... DW link 481.3 000D9E FF DB 0FFh ; not immediate 481.4 000D9F link SET $ 481.5 000D9F 05 DB 5 481.6 000DA0 2849532229 DB '(IS")' 481.7 000DA5 00 EVEN 481.8 000DA6 IF 'DOCOLON'='DOCODE' 481.9 000DA6 XISQUOTE: DW $+2 481.10 000DA6 ELSE 481.11 000DA6 .... XISQUOTE: DW DOCOLON 481.12 000DA8 ENDIF 481.13 000DA8 ENDM 482 000DA8 ............* DW RFROM,ICOUNT,TWODUP,PLUS,ALIGNED,TOR 483 000DB4 .... DW EXIT 484 000DB6 485 000DB6 ;Z (S") -- c-addr u run-time code for S" 486 000DB6 ; R@ I@ get Data address 487 000DB6 ; R> CELL+ DUP IC@ CHAR+ -- Dadr Radr+2 n+1 488 000DB6 ; 2DUP + ALIGNED >R -- Dadr Iadr n+1 489 000DB6 ; >R OVER R> I->D -- Dadr 490 000DB6 ; COUNT ; 491 000DB6 ; Harvard model, for string stored in Code space 492 000DB6 ; which is copied to Data space. 493 000DB6 HEADER XSQUOTE,4,'(S")',DOCOLON 493.1 000000 PUBLIC XSQUOTE 493.2 000DB6 .... DW link 493.3 000DB8 FF DB 0FFh ; not immediate 493.4 000DB9 link SET $ 493.5 000DB9 04 DB 4 493.6 000DBA 28532229 DB '(S")' 493.7 000DBE EVEN 493.8 000DBE IF 'DOCOLON'='DOCODE' 493.9 000DBE XSQUOTE: DW $+2 493.10 000DBE ELSE 493.11 000DBE .... XSQUOTE: DW DOCOLON 493.12 000DC0 ENDIF 493.13 000DC0 ENDM 494 000DC0 ........ DW RFETCH,IFETCH 495 000DC4 ............* DW RFROM,CELLPLUS,DUP,ICFETCH,CHARPLUS 496 000DCE ............* DW TWODUP,PLUS,ALIGNED,TOR 497 000DD6 ............* DW TOR,OVER,RFROM,ITOD,COUNT,EXIT 498 000DE2 499 000DE2 ;C IS" -- adr n compile in-line string 500 000DE2 ; COMPILE (IS") [ HEX ] 501 000DE2 ; 22 IWORD 502 000DE2 ; IC@ 1+ ALIGNED IALLOT ; IMMEDIATE 503 000DE2 ; Harvard model: string is stored in Code space 504 000DE2 IMMED ISQUOTE,3,'IS"',DOCOLON 504.1 000000 PUBLIC ISQUOTE 504.2 000DE2 .... DW link 504.3 000DE4 FE DB 0FEh // ; immediate (LSB=0) 504.4 000DE5 link SET $ 504.5 000DE5 03 DB 3 504.6 000DE6 495322 DB 'IS"' 504.7 000DE9 00 EVEN 504.8 000DEA IF 'DOCOLON'='DOCODE' 504.9 000DEA ISQUOTE: DW $+2 504.10 000DEA ELSE 504.11 000DEA .... ISQUOTE: DW DOCOLON 504.12 000DEC ENDIF 504.13 000DEC ENDM 505 000DEC ............ DW lit,XISQUOTE,COMMAXT 506 000DF2 ....2200.... DW lit,22H,IWORD 507 000DF8 ............* DW ICFETCH,ONEPLUS,ALIGNED,IALLOT,EXIT 508 000E02 509 000E02 /* 510 000E02 ; S" -- compile in-line string 511 000E02 ; COMPILE (S") [ HEX ] 512 000E02 ; HERE I, data address 513 000E02 ; 22 IWORD 514 000E02 ; IC@ 1+ ALIGNED 515 000E02 ; DUP ALLOT IALLOT ; IMMEDIATE 516 000E02 ; Harvard model: string is stored in Code space 517 000E02 IMMED SQUOTE,2,'S"',DOCOLON 518 000E02 DW lit,XSQUOTE,COMMAXT 519 000E02 DW HERE,ICOMMA,lit,22H,IWORD 520 000E02 DW ICFETCH,ONEPLUS,ALIGNED 521 000E02 DW DUP,ALLOT,IALLOT,EXIT 522 000E02 */ 523 000E02 524 000E02 525 000E02 ;C ." -- compile string to print 526 000E02 ; POSTPONE IS" POSTPONE ITYPE ; IMMEDIATE 527 000E02 IMMED DOTQUOTE,2,'."',DOCOLON 527.1 000000 PUBLIC DOTQUOTE 527.2 000E02 .... DW link 527.3 000E04 FE DB 0FEh // ; immediate (LSB=0) 527.4 000E05 link SET $ 527.5 000E05 02 DB 2 527.6 000E06 2E22 DB '."' 527.7 000E08 EVEN 527.8 000E08 IF 'DOCOLON'='DOCODE' 527.9 000E08 DOTQUOTE: DW $+2 527.10 000E08 ELSE 527.11 000E08 .... DOTQUOTE: DW DOCOLON 527.12 000E0A ENDIF 527.13 000E0A ENDM 528 000E0A .... DW ISQUOTE 529 000E0C ............ DW lit,ITYPE,COMMAXT 530 000E12 .... DW EXIT 531 000E14 532 000E14 ;Z IWORD c -- c-addr WORD to Code space 533 000E14 ; WORD 534 000E14 ; IHERE TUCK OVER C@ CHAR+ D->I ; 535 000E14 HEADER IWORD,5,'IWORD',DOCOLON 535.1 000000 PUBLIC IWORD 535.2 000E14 .... DW link 535.3 000E16 FF DB 0FFh ; not immediate 535.4 000E17 link SET $ 535.5 000E17 05 DB 5 535.6 000E18 49574F5244 DB 'IWORD' 535.7 000E1D 00 EVEN 535.8 000E1E IF 'DOCOLON'='DOCODE' 535.9 000E1E IWORD: DW $+2 535.10 000E1E ELSE 535.11 000E1E .... IWORD: DW DOCOLON 535.12 000E20 ENDIF 535.13 000E20 ENDM 536 000E20 .... DW WORDD 537 000E22 ............*IWORD1: DW IHERE,TUCK,OVER,CFETCH 538 000E2A ............ DW CHARPLUS,DTOI,EXIT 539 000E30 540 000E30 ;Z IWORDC c -- c-addr maybe capitalize WORD to Code space 541 000E30 ; WORD CAPITALIZE 542 000E30 ; IHERE TUCK OVER C@ CHAR+ D->I ; 543 000E30 ; HEADER IWORDC,6,'IWORDC',DOCOLON 544 000E30 HEADLESS IWORDC, DOCOLON 544.1 000000 PUBLIC IWORDC 544.2 000E30 IF 'DOCOLON'='DOCODE' 544.3 000E30 IWORDC: DW $+2 544.4 000E30 ELSE 544.5 000E30 .... IWORDC: DW DOCOLON 544.6 000E32 ENDIF 544.7 000E32 ENDM 545 000E32 ........ DW WORDD, CAPITALIZE 546 000E36 .... DW bran 547 000E38 DEST IWORD1 547.1 000E38 EAFF DW IWORD1-$ 547.2 000E3A ENDM 548 000E3A 549 000E3A ; SEPARATE HEADER EXTENSIONS ARE NOT USED 550 000E3A #define HCOUNT ICOUNT 551 000E3A #define HTYPE ITYPE 552 000E3A #define HWORD IWORDC 553 000E3A 554 000E3A ; NUMERIC OUTPUT =============================== = 555 000E3A ; Numeric conversion is done l.s.digit first, so 556 000E3A ; the output buffer is built backwards in memory. 557 000E3A 558 000E3A ; Some double-precision arithmetic operators are 559 000E3A ; needed to implement ANSI numeric conversion. 560 000E3A 561 000E3A ;Z UD/MOD ud1 u2 -- u3 ud4 32/16->32 divide 562 000E3A ; >R 0 R@ UM/MOD ROT ROT R> UM/MOD ROT ; 563 000E3A HEADER UDSLASHMOD,6,'UD/MOD',DOCOLON 563.1 000000 PUBLIC UDSLASHMOD 563.2 000E3A .... DW link 563.3 000E3C FF DB 0FFh ; not immediate 563.4 000E3D link SET $ 563.5 000E3D 06 DB 6 563.6 000E3E 55442F4D4F44 DB 'UD/MOD' 563.7 000E44 EVEN 563.8 000E44 IF 'DOCOLON'='DOCODE' 563.9 000E44 UDSLASHMOD: DW $+2 563.10 000E44 ELSE 563.11 000E44 .... UDSLASHMOD: DW DOCOLON 563.12 000E46 ENDIF 563.13 000E46 ENDM 564 000E46 ............* DW TOR,ZERO,RFETCH,UMSLASHMOD,ROT,ROT 565 000E52 ............* DW RFROM,UMSLASHMOD,ROT,EXIT 566 000E5A 567 000E5A ;Z UD* ud1 d2 -- ud3 32*16->32 multiply 568 000E5A ; DUP >R UM* DROP SWAP R> UM* ROT + ; 569 000E5A HEADER UDSTAR,3,'UD*',DOCOLON 569.1 000000 PUBLIC UDSTAR 569.2 000E5A .... DW link 569.3 000E5C FF DB 0FFh ; not immediate 569.4 000E5D link SET $ 569.5 000E5D 03 DB 3 569.6 000E5E 55442A DB 'UD*' 569.7 000E61 00 EVEN 569.8 000E62 IF 'DOCOLON'='DOCODE' 569.9 000E62 UDSTAR: DW $+2 569.10 000E62 ELSE 569.11 000E62 .... UDSTAR: DW DOCOLON 569.12 000E64 ENDIF 569.13 000E64 ENDM 570 000E64 ............* DW DUP,TOR,UMSTAR,DROP 571 000E6C ............* DW SWAP,RFROM,UMSTAR,ROT,PLUS,EXIT 572 000E78 573 000E78 ;C HOLD char -- add char to output string 574 000E78 ; -1 HP +! HP @ C! ; 575 000E78 HEADER HOLD,4,'HOLD',DOCOLON 575.1 000000 PUBLIC HOLD 575.2 000E78 .... DW link 575.3 000E7A FF DB 0FFh ; not immediate 575.4 000E7B link SET $ 575.5 000E7B 04 DB 4 575.6 000E7C 484F4C44 DB 'HOLD' 575.7 000E80 EVEN 575.8 000E80 IF 'DOCOLON'='DOCODE' 575.9 000E80 HOLD: DW $+2 575.10 000E80 ELSE 575.11 000E80 .... HOLD: DW DOCOLON 575.12 000E82 ENDIF 575.13 000E82 ENDM 576 000E82 ....FFFF....* DW lit,-1,HP,PLUSSTORE 577 000E8A ............* DW HP,FETCH,CSTORE,EXIT 578 000E92 579 000E92 ;C <# -- begin numeric conversion 580 000E92 ; PAD HP ! ; (initialize Hold Pointer) 581 000E92 HEADER LESSNUM,2,'<#',DOCOLON 581.1 000000 PUBLIC LESSNUM 581.2 000E92 .... DW link 581.3 000E94 FF DB 0FFh ; not immediate 581.4 000E95 link SET $ 581.5 000E95 02 DB 2 581.6 000E96 3C23 DB '<#' 581.7 000E98 EVEN 581.8 000E98 IF 'DOCOLON'='DOCODE' 581.9 000E98 LESSNUM: DW $+2 581.10 000E98 ELSE 581.11 000E98 .... LESSNUM: DW DOCOLON 581.12 000E9A ENDIF 581.13 000E9A ENDM 582 000E9A ............* DW PAD,HP,STORE,EXIT 583 000EA2 584 000EA2 ;Z >digit n -- c convert to 0..9A..Z 585 000EA2 ; [ HEX ] DUP 9 > 7 AND + 30 + ; 586 000EA2 HEADER TODIGIT,6,'>DIGIT',DOCOLON 586.1 000000 PUBLIC TODIGIT 586.2 000EA2 .... DW link 586.3 000EA4 FF DB 0FFh ; not immediate 586.4 000EA5 link SET $ 586.5 000EA5 06 DB 6 586.6 000EA6 3E4449474954 DB '>DIGIT' 586.7 000EAC EVEN 586.8 000EAC IF 'DOCOLON'='DOCODE' 586.9 000EAC TODIGIT: DW $+2 586.10 000EAC ELSE 586.11 000EAC .... TODIGIT: DW DOCOLON 586.12 000EAE ENDIF 586.13 000EAE ENDM 587 000EAE ........0900* DW DUP,lit,9,GREATER,lit,7,ANDD,PLUS 588 000EBE ....3000....* DW lit,30H,PLUS,EXIT 589 000EC6 590 000EC6 ;C # ud1 -- ud2 convert 1 digit of output 591 000EC6 ; BASE @ UD/MOD ROT >digit HOLD ; 592 000EC6 HEADER NUM,1,'#',DOCOLON 592.1 000000 PUBLIC NUM 592.2 000EC6 .... DW link 592.3 000EC8 FF DB 0FFh ; not immediate 592.4 000EC9 link SET $ 592.5 000EC9 01 DB 1 592.6 000ECA 23 DB '#' 592.7 000ECB 00 EVEN 592.8 000ECC IF 'DOCOLON'='DOCODE' 592.9 000ECC NUM: DW $+2 592.10 000ECC ELSE 592.11 000ECC .... NUM: DW DOCOLON 592.12 000ECE ENDIF 592.13 000ECE ENDM 593 000ECE ............* DW BASE,FETCH,UDSLASHMOD,ROT,TODIGIT 594 000ED8 ........ DW HOLD,EXIT 595 000EDC 596 000EDC ;C #S ud1 -- ud2 convert remaining digits 597 000EDC ; BEGIN # 2DUP OR 0= UNTIL ; 598 000EDC HEADER NUMS,2,'#S',DOCOLON 598.1 000000 PUBLIC NUMS 598.2 000EDC .... DW link 598.3 000EDE FF DB 0FFh ; not immediate 598.4 000EDF link SET $ 598.5 000EDF 02 DB 2 598.6 000EE0 2353 DB '#S' 598.7 000EE2 EVEN 598.8 000EE2 IF 'DOCOLON'='DOCODE' 598.9 000EE2 NUMS: DW $+2 598.10 000EE2 ELSE 598.11 000EE2 .... NUMS: DW DOCOLON 598.12 000EE4 ENDIF 598.13 000EE4 ENDM 599 000EE4 ............*NUMS1: DW NUM,TWODUP,ORR,ZEROEQUAL,qbran 600 000EEE DEST NUMS1 600.1 000EEE F6FF DW NUMS1-$ 600.2 000EF0 ENDM 601 000EF0 .... DW EXIT 602 000EF2 603 000EF2 ;C #> ud1 -- c-addr u end conv., get string 604 000EF2 ; 2DROP HP @ PAD OVER - ; 605 000EF2 HEADER NUMGREATER,2,'#>',DOCOLON 605.1 000000 PUBLIC NUMGREATER 605.2 000EF2 .... DW link 605.3 000EF4 FF DB 0FFh ; not immediate 605.4 000EF5 link SET $ 605.5 000EF5 02 DB 2 605.6 000EF6 233E DB '#>' 605.7 000EF8 EVEN 605.8 000EF8 IF 'DOCOLON'='DOCODE' 605.9 000EF8 NUMGREATER: DW $+2 605.10 000EF8 ELSE 605.11 000EF8 .... NUMGREATER: DW DOCOLON 605.12 000EFA ENDIF 605.13 000EFA ENDM 606 000EFA ............* DW TWODROP,HP,FETCH,PAD,OVER,MINUS,EXIT 607 000F08 608 000F08 ;C SIGN n -- add minus sign if n<0 609 000F08 ; 0< IF 2D HOLD THEN ; 610 000F08 HEADER SIGN,4,'SIGN',DOCOLON 610.1 000000 PUBLIC SIGN 610.2 000F08 .... DW link 610.3 000F0A FF DB 0FFh ; not immediate 610.4 000F0B link SET $ 610.5 000F0B 04 DB 4 610.6 000F0C 5349474E DB 'SIGN' 610.7 000F10 EVEN 610.8 000F10 IF 'DOCOLON'='DOCODE' 610.9 000F10 SIGN: DW $+2 610.10 000F10 ELSE 610.11 000F10 .... SIGN: DW DOCOLON 610.12 000F12 ENDIF 610.13 000F12 ENDM 611 000F12 ........ DW ZEROLESS,qbran 612 000F16 DEST SIGN1 612.1 000F16 0800 DW SIGN1-$ 612.2 000F18 ENDM 613 000F18 ....2D00.... DW lit,2DH,HOLD 614 000F1E .... SIGN1: DW EXIT 615 000F20 616 000F20 ;C U. u -- display u unsigned 617 000F20 ; <# 0 #S #> TYPE SPACE ; 618 000F20 HEADER UDOT,2,'U.',DOCOLON 618.1 000000 PUBLIC UDOT 618.2 000F20 .... DW link 618.3 000F22 FF DB 0FFh ; not immediate 618.4 000F23 link SET $ 618.5 000F23 02 DB 2 618.6 000F24 552E DB 'U.' 618.7 000F26 EVEN 618.8 000F26 IF 'DOCOLON'='DOCODE' 618.9 000F26 UDOT: DW $+2 618.10 000F26 ELSE 618.11 000F26 .... UDOT: DW DOCOLON 618.12 000F28 ENDIF 618.13 000F28 ENDM 619 000F28 ............* DW LESSNUM,ZERO,NUMS,NUMGREATER,TYP 620 000F32 ........ DW SPACE,EXIT 621 000F36 622 000F36 ;C . n -- display n signed 623 000F36 ; <# DUP ABS 0 #S ROT SIGN #> TYPE SPACE ; 624 000F36 HEADER DOT,1,'.',DOCOLON 624.1 000000 PUBLIC DOT 624.2 000F36 .... DW link 624.3 000F38 FF DB 0FFh ; not immediate 624.4 000F39 link SET $ 624.5 000F39 01 DB 1 624.6 000F3A 2E DB '.' 624.7 000F3B 00 EVEN 624.8 000F3C IF 'DOCOLON'='DOCODE' 624.9 000F3C DOT: DW $+2 624.10 000F3C ELSE 624.11 000F3C .... DOT: DW DOCOLON 624.12 000F3E ENDIF 624.13 000F3E ENDM 625 000F3E ............* DW LESSNUM,DUP,ABBS,ZERO,NUMS 626 000F48 ............* DW ROT,SIGN,NUMGREATER,TYP,SPACE,EXIT 627 000F54 628 000F54 ;C DECIMAL -- set number base to decimal 629 000F54 ; 10 BASE ! ; 630 000F54 HEADER DECIMAL,7,'DECIMAL',DOCOLON 630.1 000000 PUBLIC DECIMAL 630.2 000F54 .... DW link 630.3 000F56 FF DB 0FFh ; not immediate 630.4 000F57 link SET $ 630.5 000F57 07 DB 7 630.6 000F58 444543494D41* DB 'DECIMAL' 630.7 000F5F 00 EVEN 630.8 000F60 IF 'DOCOLON'='DOCODE' 630.9 000F60 DECIMAL: DW $+2 630.10 000F60 ELSE 630.11 000F60 .... DECIMAL: DW DOCOLON 630.12 000F62 ENDIF 630.13 000F62 ENDM 631 000F62 ....0A00....* DW lit,10,BASE,STORE,EXIT 632 000F6C 633 000F6C ;X HEX -- set number base to hex 634 000F6C ; 16 BASE ! ; 635 000F6C HEADER HEX,3,'HEX',DOCOLON 635.1 000000 PUBLIC HEX 635.2 000F6C .... DW link 635.3 000F6E FF DB 0FFh ; not immediate 635.4 000F6F link SET $ 635.5 000F6F 03 DB 3 635.6 000F70 484558 DB 'HEX' 635.7 000F73 00 EVEN 635.8 000F74 IF 'DOCOLON'='DOCODE' 635.9 000F74 HEX: DW $+2 635.10 000F74 ELSE 635.11 000F74 .... HEX: DW DOCOLON 635.12 000F76 ENDIF 635.13 000F76 ENDM 636 000F76 ....1000....* DW lit,16,BASE,STORE,EXIT 637 000F80 638 000F80 ; DICTIONARY MANAGEMENT ======================== = 639 000F80 640 000F80 ;C HERE -- addr returns dictionary ptr 641 000F80 ; DP @ ; 642 000F80 HEADER HERE,4,'HERE',DOCOLON 642.1 000000 PUBLIC HERE 642.2 000F80 .... DW link 642.3 000F82 FF DB 0FFh ; not immediate 642.4 000F83 link SET $ 642.5 000F83 04 DB 4 642.6 000F84 48455245 DB 'HERE' 642.7 000F88 EVEN 642.8 000F88 IF 'DOCOLON'='DOCODE' 642.9 000F88 HERE: DW $+2 642.10 000F88 ELSE 642.11 000F88 .... HERE: DW DOCOLON 642.12 000F8A ENDIF 642.13 000F8A ENDM 643 000F8A ............ DW DDP,FETCH,EXIT 644 000F90 645 000F90 ;C ALLOT n -- allocate n bytes in dict 646 000F90 ; DP +! ; 647 000F90 HEADER ALLOT,5,'ALLOT',DOCOLON 647.1 000000 PUBLIC ALLOT 647.2 000F90 .... DW link 647.3 000F92 FF DB 0FFh ; not immediate 647.4 000F93 link SET $ 647.5 000F93 05 DB 5 647.6 000F94 414C4C4F54 DB 'ALLOT' 647.7 000F99 00 EVEN 647.8 000F9A IF 'DOCOLON'='DOCODE' 647.9 000F9A ALLOT: DW $+2 647.10 000F9A ELSE 647.11 000F9A .... ALLOT: DW DOCOLON 647.12 000F9C ENDIF 647.13 000F9C ENDM 648 000F9C ............ DW DDP,PLUSSTORE,EXIT 649 000FA2 650 000FA2 ;C , x -- append cell to dict 651 000FA2 ; HERE ! 1 CELLS ALLOT ; 652 000FA2 HEADER COMMA,1,',',DOCOLON 652.1 000000 PUBLIC COMMA 652.2 000FA2 .... DW link 652.3 000FA4 FF DB 0FFh ; not immediate 652.4 000FA5 link SET $ 652.5 000FA5 01 DB 1 652.6 000FA6 2C DB ',' 652.7 000FA7 00 EVEN 652.8 000FA8 IF 'DOCOLON'='DOCODE' 652.9 000FA8 COMMA: DW $+2 652.10 000FA8 ELSE 652.11 000FA8 .... COMMA: DW DOCOLON 652.12 000FAA ENDIF 652.13 000FAA ENDM 653 000FAA ............* DW HERE,STORE,lit,1,CELLS,ALLOT,EXIT 654 000FB8 655 000FB8 ;C C, char -- append char to dict 656 000FB8 ; HERE C! 1 CHARS ALLOT ; 657 000FB8 HEADER CCOMMA,2,'C,',DOCOLON 657.1 000000 PUBLIC CCOMMA 657.2 000FB8 .... DW link 657.3 000FBA FF DB 0FFh ; not immediate 657.4 000FBB link SET $ 657.5 000FBB 02 DB 2 657.6 000FBC 432C DB 'C,' 657.7 000FBE EVEN 657.8 000FBE IF 'DOCOLON'='DOCODE' 657.9 000FBE CCOMMA: DW $+2 657.10 000FBE ELSE 657.11 000FBE .... CCOMMA: DW DOCOLON 657.12 000FC0 ENDIF 657.13 000FC0 ENDM 658 000FC0 ............* DW HERE,CSTORE,lit,1,CHARS,ALLOT,EXIT 659 000FCE 660 000FCE ; The following additional words support the 661 000FCE ; "Harvard" model, with separate address spaces 662 000FCE ; for Instructions (Code) and Data. ANSI 663 000FCE ; requires DP to manage the Data space, so a 664 000FCE ; separate Instruction Dictionary Pointer, IDP, 665 000FCE ; is added to manage the Code space. Also added: 666 000FCE ; I@ IC@ I! IC! I->D D->I (in the primitives ) 667 000FCE ; ITYPE ICOUNT IWORD (above) 668 000FCE ; IHERE IALLOT I, IC, (below) 669 000FCE ; It should be possible to convert the Harvard 670 000FCE ; implementation to a combined-code-and-data 671 000FCE ; system, by equating these words to their 672 000FCE ; Data-space counterparts. 673 000FCE 674 000FCE ; on MSP430 we have Neumann, but 675 000FCE ; I! IC! D->I (in the primitives) work on flash 676 000FCE ; I@ IC@ alias @ C@ 677 000FCE ; I->D alias CMOVE 678 000FCE ; IWORD works on flash 679 000FCE ; IHERE IALLOT I, IC, work on flash 680 000FCE 681 000FCE ;C IHERE -- addr returns Code dictionary ptr 682 000FCE ; IDP @ ; 683 000FCE HEADER IHERE,5,'IHERE',DOCOLON 683.1 000000 PUBLIC IHERE 683.2 000FCE .... DW link 683.3 000FD0 FF DB 0FFh ; not immediate 683.4 000FD1 link SET $ 683.5 000FD1 05 DB 5 683.6 000FD2 4948455245 DB 'IHERE' 683.7 000FD7 00 EVEN 683.8 000FD8 IF 'DOCOLON'='DOCODE' 683.9 000FD8 IHERE: DW $+2 683.10 000FD8 ELSE 683.11 000FD8 .... IHERE: DW DOCOLON 683.12 000FDA ENDIF 683.13 000FDA ENDM 684 000FDA ............ DW IDP,FETCH,EXIT 685 000FE0 686 000FE0 ;C IALLOT n -- allocate n bytes in Code dict 687 000FE0 ; IDP +! ; 688 000FE0 HEADER IALLOT,6,'IALLOT',DOCOLON 688.1 000000 PUBLIC IALLOT 688.2 000FE0 .... DW link 688.3 000FE2 FF DB 0FFh ; not immediate 688.4 000FE3 link SET $ 688.5 000FE3 06 DB 6 688.6 000FE4 49414C4C4F54 DB 'IALLOT' 688.7 000FEA EVEN 688.8 000FEA IF 'DOCOLON'='DOCODE' 688.9 000FEA IALLOT: DW $+2 688.10 000FEA ELSE 688.11 000FEA .... IALLOT: DW DOCOLON 688.12 000FEC ENDIF 688.13 000FEC ENDM 689 000FEC ............ DW IDP,PLUSSTORE,EXIT 690 000FF2 691 000FF2 ;C I, x -- append cell to Code dict 692 000FF2 ; IHERE I! 1 CELLS IALLOT ; 693 000FF2 HEADER ICOMMA,2,'I,',DOCOLON 693.1 000000 PUBLIC ICOMMA 693.2 000FF2 .... DW link 693.3 000FF4 FF DB 0FFh ; not immediate 693.4 000FF5 link SET $ 693.5 000FF5 02 DB 2 693.6 000FF6 492C DB 'I,' 693.7 000FF8 EVEN 693.8 000FF8 IF 'DOCOLON'='DOCODE' 693.9 000FF8 ICOMMA: DW $+2 693.10 000FF8 ELSE 693.11 000FF8 .... ICOMMA: DW DOCOLON 693.12 000FFA ENDIF 693.13 000FFA ENDM 694 000FFA ............* DW IHERE,ISTORE,lit,1,CELLS,IALLOT,EXIT 695 001008 696 001008 ;C IC, char -- append char to Code dict 697 001008 ; IHERE IC! 1 CHARS IALLOT ; 698 001008 HEADER ICCOMMA,3,'IC,',DOCOLON 698.1 000000 PUBLIC ICCOMMA 698.2 001008 .... DW link 698.3 00100A FF DB 0FFh ; not immediate 698.4 00100B link SET $ 698.5 00100B 03 DB 3 698.6 00100C 49432C DB 'IC,' 698.7 00100F 00 EVEN 698.8 001010 IF 'DOCOLON'='DOCODE' 698.9 001010 ICCOMMA: DW $+2 698.10 001010 ELSE 698.11 001010 .... ICCOMMA: DW DOCOLON 698.12 001012 ENDIF 698.13 001012 ENDM 699 001012 ............* DW IHERE,ICSTORE,lit,1,CHARS,IALLOT,EXIT 700 001020 701 001020 ; SEPARATE HEADER EXTENSIONS ARE NOT USED 702 001020 #define HHERE IHERE 703 001020 #define HALLOT IALLOT 704 001020 #define HCOMMA ICOMMA 705 001020 #define HCCOMMA ICCOMMA 706 001020 #define HCFETCH ICFETCH 707 001020 #define HFETCH IFETCH 708 001020 #define HCSTORE ICSTORE 709 001020 #define HSTORE ISTORE 710 001020 711 001020 ; INTERPRETER ================================== = 712 001020 ; Note that NFA>LFA, NFA>CFA, IMMED?, and FIND 713 001020 ; are dependent on the structure of the Forth 714 001020 ; header. This may be common across many CPUs, 715 001020 ; or it may be different. 716 001020 717 001020 ;C SOURCE -- adr n current input buffer 718 001020 ; 'SOURCE 2@ ; length is at lower adrs 719 001020 HEADER SOURCE,6,'SOURCE',DOCOLON 719.1 000000 PUBLIC SOURCE 719.2 001020 .... DW link 719.3 001022 FF DB 0FFh ; not immediate 719.4 001023 link SET $ 719.5 001023 06 DB 6 719.6 001024 534F55524345 DB 'SOURCE' 719.7 00102A EVEN 719.8 00102A IF 'DOCOLON'='DOCODE' 719.9 00102A SOURCE: DW $+2 719.10 00102A ELSE 719.11 00102A .... SOURCE: DW DOCOLON 719.12 00102C ENDIF 719.13 00102C ENDM 720 00102C ............ DW TICKSOURCE,TWOFETCH,EXIT 721 001032 722 001032 ;X /STRING a u n -- a+n u-n trim string 723 001032 ; ROT OVER + ROT ROT - ; 724 001032 HEADER SLASHSTRING,7,'/STRING',DOCOLON 724.1 000000 PUBLIC SLASHSTRING 724.2 001032 .... DW link 724.3 001034 FF DB 0FFh ; not immediate 724.4 001035 link SET $ 724.5 001035 07 DB 7 724.6 001036 2F535452494E* DB '/STRING' 724.7 00103D 00 EVEN 724.8 00103E IF 'DOCOLON'='DOCODE' 724.9 00103E SLASHSTRING: DW $+2 724.10 00103E ELSE 724.11 00103E .... SLASHSTRING: DW DOCOLON 724.12 001040 ENDIF 724.13 001040 ENDM 725 001040 ............* DW ROT,OVER,PLUS,ROT,ROT,MINUS,EXIT 726 00104E 727 00104E ;Z >counted src n dst -- copy to counted str 728 00104E ; 2DUP C! CHAR+ SWAP CMOVE ; 729 00104E HEADER TOCOUNTED,8,'>COUNTED',DOCOLON 729.1 000000 PUBLIC TOCOUNTED 729.2 00104E .... DW link 729.3 001050 FF DB 0FFh ; not immediate 729.4 001051 link SET $ 729.5 001051 08 DB 8 729.6 001052 3E434F554E54* DB '>COUNTED' 729.7 00105A EVEN 729.8 00105A IF 'DOCOLON'='DOCODE' 729.9 00105A TOCOUNTED: DW $+2 729.10 00105A ELSE 729.11 00105A .... TOCOUNTED: DW DOCOLON 729.12 00105C ENDIF 729.13 00105C ENDM 730 00105C ............* DW TWODUP,CSTORE,CHARPLUS,SWAP,CMOVE,EXI T 731 001068 732 001068 ;C WORD char -- c-addr n word delim'd by char 733 001068 ; DUP SOURCE >IN @ /STRING -- c c adr n 734 001068 ; DUP >R ROT SKIP -- c adr' n' 735 001068 ; OVER >R ROT SCAN -- adr" n" 736 001068 ; DUP IF CHAR- THEN skip trailing delim. 737 001068 ; R> R> ROT - >IN +! update >IN offset 738 001068 ; TUCK - -- adr' N 739 001068 ; HERE >counted -- 740 001068 ; HERE -- a 741 001068 ; BL OVER COUNT + C! ; append trailing blank 742 001068 HEADER WORDD,4,'WORD',DOCOLON 742.1 000000 PUBLIC WORDD 742.2 001068 .... DW link 742.3 00106A FF DB 0FFh ; not immediate 742.4 00106B link SET $ 742.5 00106B 04 DB 4 742.6 00106C 574F5244 DB 'WORD' 742.7 001070 EVEN 742.8 001070 IF 'DOCOLON'='DOCODE' 742.9 001070 WORDD: DW $+2 742.10 001070 ELSE 742.11 001070 .... WORDD: DW DOCOLON 742.12 001072 ENDIF 742.13 001072 ENDM 743 001072 ............* DW DUP,SOURCE,TOIN,FETCH,SLASHSTRING 744 00107C ............* DW DUP,TOR,ROT,SKIP 745 001084 ............* DW OVER,TOR,ROT,SCAN 746 00108C ........ DW DUP,qbran 747 001090 DEST WORD1 747.1 001090 0400 DW WORD1-$ 747.2 001092 ENDM 748 001092 .... DW ONEMINUS ; char- 749 001094 ............*WORD1: DW RFROM,RFROM,ROT,MINUS,TOIN,PLUSSTORE 750 0010A0 ........ DW TUCK,MINUS 751 0010A4 ............ DW HERE,TOCOUNTED,HERE 752 0010AA ............* DW BLANK,OVER,COUNT,PLUS,CSTORE,EXIT 753 0010B6 754 0010B6 ;Z NFA>LFA nfa -- lfa name adr -> link field 755 0010B6 ; 3 - ; 756 0010B6 HEADER NFATOLFA,7,'NFA>LFA',DOCOLON 756.1 000000 PUBLIC NFATOLFA 756.2 0010B6 .... DW link 756.3 0010B8 FF DB 0FFh ; not immediate 756.4 0010B9 link SET $ 756.5 0010B9 07 DB 7 756.6 0010BA 4E46413E4C46* DB 'NFA>LFA' 756.7 0010C1 00 EVEN 756.8 0010C2 IF 'DOCOLON'='DOCODE' 756.9 0010C2 NFATOLFA: DW $+2 756.10 0010C2 ELSE 756.11 0010C2 .... NFATOLFA: DW DOCOLON 756.12 0010C4 ENDIF 756.13 0010C4 ENDM 757 0010C4 ....0300....* DW lit,3,MINUS,EXIT 758 0010CC 759 0010CC ;Z NFA>CFA nfa -- cfa name adr -> code field 760 0010CC ; HCOUNT 7F AND + ALIGNED ; mask off 'smudge' bit 761 0010CC HEADER NFATOCFA,7,'NFA>CFA',DOCOLON 761.1 000000 PUBLIC NFATOCFA 761.2 0010CC .... DW link 761.3 0010CE FF DB 0FFh ; not immediate 761.4 0010CF link SET $ 761.5 0010CF 07 DB 7 761.6 0010D0 4E46413E4346* DB 'NFA>CFA' 761.7 0010D7 00 EVEN 761.8 0010D8 IF 'DOCOLON'='DOCODE' 761.9 0010D8 NFATOCFA: DW $+2 761.10 0010D8 ELSE 761.11 0010D8 .... NFATOCFA: DW DOCOLON 761.12 0010DA ENDIF 761.13 0010DA ENDM 762 0010DA .... DW HCOUNT 763 0010DC ....7F00....* DW lit,07FH,ANDD,PLUS,ALIGNED,EXIT 764 0010E8 765 0010E8 ;Z IMMED? nfa -- f fetch immediate flag 766 0010E8 ; 1- HC@ 1 AND 0= ; Flashable model, LSB=0 if immed 767 0010E8 HEADER IMMEDQ,6,'IMMED?',DOCOLON 767.1 000000 PUBLIC IMMEDQ 767.2 0010E8 .... DW link 767.3 0010EA FF DB 0FFh ; not immediate 767.4 0010EB link SET $ 767.5 0010EB 06 DB 6 767.6 0010EC 494D4D45443F DB 'IMMED?' 767.7 0010F2 EVEN 767.8 0010F2 IF 'DOCOLON'='DOCODE' 767.9 0010F2 IMMEDQ: DW $+2 767.10 0010F2 ELSE 767.11 0010F2 .... IMMEDQ: DW DOCOLON 767.12 0010F4 ENDIF 767.13 0010F4 ENDM 768 0010F4 ............* DW ONEMINUS,HCFETCH,lit,1,ANDD,ZEROEQUAL ,EXIT 769 001102 770 001102 ;C FIND c-addr -- c-addr 0 if not found 771 001102 ;C FIND c-addr -- xt 1 if immediate 772 001102 ;C FIND c-addr -- xt -1 if "normal" 773 001102 ; LATEST @ BEGIN -- a nfa 774 001102 ; 2DUP OVER C@ CHAR+ -- a nfa a nfa n+1 775 001102 ; N= -- a nfa f 776 001102 ; DUP IF 777 001102 ; DROP 778 001102 ; NFA>LFA H@ DUP -- a link link 779 001102 ; THEN 780 001102 ; 0= UNTIL -- a nfa OR a 0 781 001102 ; DUP IF 782 001102 ; NIP DUP NFA>CFA -- nfa xt 783 001102 ; SWAP IMMED? -- xt iflag 784 001102 ; 0= 1 OR -- xt 1/-1 785 001102 ; THEN ; 786 001102 HEADER FIND,4,'FIND',DOCOLON 786.1 000000 PUBLIC FIND 786.2 001102 .... DW link 786.3 001104 FF DB 0FFh ; not immediate 786.4 001105 link SET $ 786.5 001105 04 DB 4 786.6 001106 46494E44 DB 'FIND' 786.7 00110A EVEN 786.8 00110A IF 'DOCOLON'='DOCODE' 786.9 00110A FIND: DW $+2 786.10 00110A ELSE 786.11 00110A .... FIND: DW DOCOLON 786.12 00110C ENDIF 786.13 00110C ENDM 787 00110C ........ DW LATEST,FETCH 788 001110 ............*FIND1: DW TWODUP,OVER,CFETCH,CHARPLUS 789 001118 ............ DW NEQUAL,DUP,qbran 790 00111E DEST FIND2 790.1 00111E 0A00 DW FIND2-$ 790.2 001120 ENDM 791 001120 ............* DW DROP,NFATOLFA,HFETCH,DUP 792 001128 ........ FIND2: DW ZEROEQUAL,qbran 793 00112C DEST FIND1 793.1 00112C E4FF DW FIND1-$ 793.2 00112E ENDM 794 00112E ........ DW DUP,qbran 795 001132 DEST FIND3 795.1 001132 1400 DW FIND3-$ 795.2 001134 ENDM 796 001134 ............ DW NIP,DUP,NFATOCFA 797 00113A ............* DW SWAP,IMMEDQ,ZEROEQUAL,lit,1,ORR 798 001146 .... FIND3: DW EXIT 799 001148 800 001148 ;C UPC char -- char capitalize character 801 001148 ; 802 001148 ; DUP [CHAR] a < OVER [CHAR] z > OR IF EXIT THEN 803 001148 ; [ CHAR A CHAR a - ] LITERAL + ; 804 001148 ; HEADER UPC,3,'UPC',DOCOLON 805 001148 HEADLESS UPC, DOCOLON 805.1 000000 PUBLIC UPC 805.2 001148 IF 'DOCOLON'='DOCODE' 805.3 001148 UPC: DW $+2 805.4 001148 ELSE 805.5 001148 .... UPC: DW DOCOLON 805.6 00114A ENDIF 805.7 00114A ENDM 806 00114A ........6100* DW DUP, lit, 'a', LESS, OVER, lit, 'z', GREATER 807 00115A ........ DW ORR, qbran 808 00115E DEST UPC1 808.1 00115E 0400 DW UPC1-$ 808.2 001160 ENDM 809 001160 .... DW EXIT 810 001162 ....E0FF.... UPC1: DW lit, 'A'-'a', PLUS 811 001168 .... DW EXIT 812 00116A 813 00116A ;C CAPITALIZE c-addr -- c-addr capitalize string 814 00116A ; 815 00116A ; CAPS @ IF DUP COUNT OVER + SWAP ?DO I c@ upc I c! LOOP THEN 816 00116A ; HEADER CAPITALIZE, 10, 'CAPITALIZE', DOCOLON 817 00116A HEADLESS CAPITALIZE, DOCOLON 817.1 000000 PUBLIC CAPITALIZE 817.2 00116A IF 'DOCOLON'='DOCODE' 817.3 00116A CAPITALIZE: DW $+2 817.4 00116A ELSE 817.5 00116A .... CAPITALIZE: DW DOCOLON 817.6 00116C ENDIF 817.7 00116C ENDM 818 00116C ............ DW CAPS, FETCH, qbran 819 001172 DEST CAPS2 819.1 001172 1C00 DW CAPS2-$ 819.2 001174 ENDM 820 001174 ............* DW DUP, COUNT, OVER, PLUS, SWAP, xdo 821 001180 ............*CAPS1: DW II, CFETCH, UPC, II, CSTORE 822 00118A .... DW xloop 823 00118C DEST CAPS1 823.1 00118C F4FF DW CAPS1-$ 823.2 00118E ENDM 824 00118E .... CAPS2: DW EXIT 825 001190 826 001190 ;C LITERAL x -- append numeric literal 827 001190 ; STATE @ IF ['] LIT ,XT I, THEN ; IMMEDIATE 828 001190 ; This tests STATE so that it can also be used 829 001190 ; interpretively. (ANSI doesn't require this.) 830 001190 IMMED LITERAL,7,'LITERAL',DOCOLON 830.1 000000 PUBLIC LITERAL 830.2 001190 .... DW link 830.3 001192 FE DB 0FEh // ; immediate (LSB=0) 830.4 001193 link SET $ 830.5 001193 07 DB 7 830.6 001194 4C4954455241* DB 'LITERAL' 830.7 00119B 00 EVEN 830.8 00119C IF 'DOCOLON'='DOCODE' 830.9 00119C LITERAL: DW $+2 830.10 00119C ELSE 830.11 00119C .... LITERAL: DW DOCOLON 830.12 00119E ENDIF 830.13 00119E ENDM 831 00119E ............ DW STATE,FETCH,qbran 832 0011A4 DEST LITER1 832.1 0011A4 0A00 DW LITER1-$ 832.2 0011A6 ENDM 833 0011A6 ............* DW lit,lit,COMMAXT,ICOMMA 834 0011AE .... LITER1: DW EXIT 835 0011B0 836 0011B0 ;Z DIGIT? c -- n -1 if c is a valid digit 837 0011B0 ;Z DIGIT? c -- x 0 otherwise 838 0011B0 ; [ HEX ] DUP 39 > 100 AND + silly looking 839 0011B0 ; DUP 140 > 107 AND - 30 - but it works! 840 0011B0 ; DUP BASE @ U< ; 841 0011B0 HEADER DIGITQ,6,'DIGIT?',DOCOLON 841.1 000000 PUBLIC DIGITQ 841.2 0011B0 .... DW link 841.3 0011B2 FF DB 0FFh ; not immediate 841.4 0011B3 link SET $ 841.5 0011B3 06 DB 6 841.6 0011B4 44494749543F DB 'DIGIT?' 841.7 0011BA EVEN 841.8 0011BA IF 'DOCOLON'='DOCODE' 841.9 0011BA DIGITQ: DW $+2 841.10 0011BA ELSE 841.11 0011BA .... DIGITQ: DW DOCOLON 841.12 0011BC ENDIF 841.13 0011BC ENDM 842 0011BC ........3900* DW DUP,lit,39H,GREATER,lit,100H,ANDD,PLU S 843 0011CC ........4001* DW DUP,lit,140H,GREATER,lit,107H,ANDD 844 0011DA ........3000* DW MINUS,lit,30H,MINUS 845 0011E2 ............* DW DUP,BASE,FETCH,ULESS,EXIT 846 0011EC 847 0011EC ;Z ?SIGN adr n -- adr' n' f get optional sign 848 0011EC ; advance adr/n if sign; return NZ if negative 849 0011EC ; OVER C@ -- adr n c 850 0011EC ; 2C - DUP ABS 1 = AND -- +=-1, -=+1, else 0 851 0011EC ; DUP IF 1+ -- +=0, -=+2 852 0011EC ; >R 1 /STRING R> -- adr' n' f 853 0011EC ; THEN ; 854 0011EC HEADER QSIGN,5,'?SIGN',DOCOLON 854.1 000000 PUBLIC QSIGN 854.2 0011EC .... DW link 854.3 0011EE FF DB 0FFh ; not immediate 854.4 0011EF link SET $ 854.5 0011EF 05 DB 5 854.6 0011F0 3F5349474E DB '?SIGN' 854.7 0011F5 00 EVEN 854.8 0011F6 IF 'DOCOLON'='DOCODE' 854.9 0011F6 QSIGN: DW $+2 854.10 0011F6 ELSE 854.11 0011F6 .... QSIGN: DW DOCOLON 854.12 0011F8 ENDIF 854.13 0011F8 ENDM 855 0011F8 ............* DW OVER,CFETCH,lit,2CH,MINUS,DUP,ABBS 856 001206 ....0100....* DW lit,1,EQUAL,ANDD,DUP,qbran 857 001212 DEST QSIGN1 857.1 001212 0E00 DW QSIGN1-$ 857.2 001214 ENDM 858 001214 ............* DW ONEPLUS,TOR,lit,1,SLASHSTRING,RFROM 859 001220 .... QSIGN1: DW EXIT 860 001222 861 001222 ;C >NUMBER ud adr u -- ud' adr' u' convert string to number 862 001222 ; BEGIN 863 001222 ; DUP WHILE 864 001222 ; OVER C@ DIGIT? 865 001222 ; 0= IF DROP EXIT THEN 866 001222 ; >R 2SWAP BASE @ UD* 867 001222 ; R> M+ 2SWAP 868 001222 ; 1 /STRING 869 001222 ; REPEAT ; 870 001222 HEADER TONUMBER,7,'>NUMBER',DOCOLON 870.1 000000 PUBLIC TONUMBER 870.2 001222 .... DW link 870.3 001224 FF DB 0FFh ; not immediate 870.4 001225 link SET $ 870.5 001225 07 DB 7 870.6 001226 3E4E554D4245* DB '>NUMBER' 870.7 00122D 00 EVEN 870.8 00122E IF 'DOCOLON'='DOCODE' 870.9 00122E TONUMBER: DW $+2 870.10 00122E ELSE 870.11 00122E .... TONUMBER: DW DOCOLON 870.12 001230 ENDIF 870.13 001230 ENDM 871 001230 ........ TONUM1: DW DUP,qbran 872 001234 DEST TONUM3 872.1 001234 2C00 DW TONUM3-$ 872.2 001236 ENDM 873 001236 ............ DW OVER,CFETCH,DIGITQ 874 00123C ........ DW ZEROEQUAL,qbran 875 001240 DEST TONUM2 875.1 001240 0600 DW TONUM2-$ 875.2 001242 ENDM 876 001242 ........ DW DROP,EXIT 877 001246 ............*TONUM2: DW TOR,TWOSWAP,BASE,FETCH,UDSTAR 878 001250 ............ DW RFROM,MPLUS,TWOSWAP 879 001256 ....0100....* DW lit,1,SLASHSTRING,bran 880 00125E DEST TONUM1 880.1 00125E D2FF DW TONUM1-$ 880.2 001260 ENDM 881 001260 .... TONUM3: DW EXIT 882 001262 883 001262 ;Z ?NUMBER c-addr -- n -1 string->number 884 001262 ;Z ?NUMBER c-addr -- c-addr 0 if convert error 885 001262 ; DUP 0 0 ROT COUNT -- ca ud adr n 886 001262 ; ?SIGN >R >NUMBER -- ca ud adr' n' 887 001262 ; IF R> 2DROP 2DROP 0 -- ca 0 (error) 888 001262 ; ELSE 2DROP NIP R> 889 001262 ; IF NEGATE THEN -1 -- n -1 (ok) 890 001262 ; THEN ; 891 001262 HEADER QNUMBER,7,'?NUMBER',DOCOLON 891.1 000000 PUBLIC QNUMBER 891.2 001262 .... DW link 891.3 001264 FF DB 0FFh ; not immediate 891.4 001265 link SET $ 891.5 001265 07 DB 7 891.6 001266 3F4E554D4245* DB '?NUMBER' 891.7 00126D 00 EVEN 891.8 00126E IF 'DOCOLON'='DOCODE' 891.9 00126E QNUMBER: DW $+2 891.10 00126E ELSE 891.11 00126E .... QNUMBER: DW DOCOLON 891.12 001270 ENDIF 891.13 001270 ENDM 892 001270 ............* DW DUP,ZERO,DUP,ROT,COUNT 893 00127A ............* DW QSIGN,TOR,TONUMBER,qbran 894 001282 DEST QNUM1 894.1 001282 1000 DW QNUM1-$ 894.2 001284 ENDM 895 001284 ............* DW RFROM,TWODROP,TWODROP,lit,0 896 00128E .... DW bran 897 001290 DEST QNUM3 897.1 001290 1200 DW QNUM3-$ 897.2 001292 ENDM 898 001292 ............*QNUM1: DW TWODROP,NIP,RFROM,qbran 899 00129A DEST QNUM2 899.1 00129A 0400 DW QNUM2-$ 899.2 00129C ENDM 900 00129C .... DW NEGATE 901 00129E ....FFFF QNUM2: DW lit,-1 902 0012A2 .... QNUM3: DW EXIT 903 0012A4 904 0012A4 ;Z INTERPRET i*x c-addr u -- j*x interpret given buffer 905 0012A4 ; This is a common factor of EVALUATE and QUIT. 906 0012A4 ; ref. dpANS-6, 3.4 The Forth Text Interpreter 907 0012A4 ; 'SOURCE 2! 0 >IN ! 908 0012A4 ; BEGIN 909 0012A4 ; BL WORD DUP C@ WHILE -- textadr 910 0012A4 ; CAPITALIZE 911 0012A4 ; FIND -- a 0/1/-1 912 0012A4 ; ?DUP IF -- xt 1/-1 913 0012A4 ; 1+ STATE @ 0= OR IMMED or interp? 914 0012A4 ; IF EXECUTE ELSE ,XT THEN 915 0012A4 ; ELSE -- textadr 916 0012A4 ; ?NUMBER 917 0012A4 ; IF POSTPONE LITERAL converted ok 918 0012A4 ; ELSE COUNT TYPE 3F EMIT CR ABORT err 919 0012A4 ; THEN 920 0012A4 ; THEN 921 0012A4 ; REPEAT DROP ; 922 0012A4 HEADER INTERPRET,9,'INTERPRET',DOCOLON 922.1 000000 PUBLIC INTERPRET 922.2 0012A4 .... DW link 922.3 0012A6 FF DB 0FFh ; not immediate 922.4 0012A7 link SET $ 922.5 0012A7 09 DB 9 922.6 0012A8 494E54455250* DB 'INTERPRET' 922.7 0012B1 00 EVEN 922.8 0012B2 IF 'DOCOLON'='DOCODE' 922.9 0012B2 INTERPRET: DW $+2 922.10 0012B2 ELSE 922.11 0012B2 .... INTERPRET: DW DOCOLON 922.12 0012B4 ENDIF 922.13 0012B4 ENDM 923 0012B4 ............* DW TICKSOURCE,TWOSTORE,ZERO,TOIN,STORE 924 0012BE ............*INTER1: DW BLANK,WORDD,DUP,CFETCH,qbran 925 0012C8 DEST INTER9 925.1 0012C8 4400 DW INTER9-$ 925.2 0012CA ENDM 926 0012CA .... DW CAPITALIZE 927 0012CC ............ DW FIND,QDUP,qbran 928 0012D2 DEST INTER4 928.1 0012D2 1C00 DW INTER4-$ 928.2 0012D4 ENDM 929 0012D4 ............* DW ONEPLUS,STATE,FETCH,ZEROEQUAL,ORR 930 0012DE .... DW qbran 931 0012E0 DEST INTER2 931.1 0012E0 0800 DW INTER2-$ 931.2 0012E2 ENDM 932 0012E2 ........ DW EXECUTE,bran 933 0012E6 DEST INTER3 933.1 0012E6 0400 DW INTER3-$ 933.2 0012E8 ENDM 934 0012E8 .... INTER2: DW COMMAXT 935 0012EA .... INTER3: DW bran 936 0012EC DEST INTER8 936.1 0012EC 1C00 DW INTER8-$ 936.2 0012EE ENDM 937 0012EE ........ INTER4: DW QNUMBER,qbran 938 0012F2 DEST INTER5 938.1 0012F2 0800 DW INTER5-$ 938.2 0012F4 ENDM 939 0012F4 ........ DW LITERAL,bran 940 0012F8 DEST INTER6 940.1 0012F8 1000 DW INTER6-$ 940.2 0012FA ENDM 941 0012FA ............*INTER5: DW COUNT,TYP,lit,3FH,EMIT,CR,ABORT 942 001308 INTER6: 943 001308 .... INTER8: DW bran 944 00130A DEST INTER1 944.1 00130A B4FF DW INTER1-$ 944.2 00130C ENDM 945 00130C ........ INTER9: DW DROP,EXIT 946 001310 947 001310 ;C EVALUATE i*x c-addr u -- j*x interprt string 948 001310 ; 'SOURCE 2@ >R >R >IN @ >R 949 001310 ; INTERPRET 950 001310 ; R> >IN ! R> R> 'SOURCE 2! ; 951 001310 HEADER EVALUATE,8,'EVALUATE',DOCOLON 951.1 000000 PUBLIC EVALUATE 951.2 001310 .... DW link 951.3 001312 FF DB 0FFh ; not immediate 951.4 001313 link SET $ 951.5 001313 08 DB 8 951.6 001314 4556414C5541* DB 'EVALUATE' 951.7 00131C EVEN 951.8 00131C IF 'DOCOLON'='DOCODE' 951.9 00131C EVALUATE: DW $+2 951.10 00131C ELSE 951.11 00131C .... EVALUATE: DW DOCOLON 951.12 00131E ENDIF 951.13 00131E ENDM 952 00131E ............* DW TICKSOURCE,TWOFETCH,TOR,TOR 953 001326 ............* DW TOIN,FETCH,TOR,INTERPRET 954 00132E ............* DW RFROM,TOIN,STORE,RFROM,RFROM 955 001338 ............ DW TICKSOURCE,TWOSTORE,EXIT 956 00133E 957 00133E #define PREFIXPROMPT 0 958 00133E 959 00133E ; C DOTSTATUS -- display system status 960 00133E HEADLESS DOTSTATUS,DOCOLON 960.1 000000 PUBLIC DOTSTATUS 960.2 00133E IF 'DOCOLON'='DOCODE' 960.3 00133E DOTSTATUS: DW $+2 960.4 00133E ELSE 960.5 00133E .... DOTSTATUS: DW DOCOLON 960.6 001340 ENDIF 960.7 001340 ENDM 961 001340 ....1100.... DW lit,11H,EMIT ; send XON 962 001346 .... DW CR 963 001348 IF PREFIXPROMPT=1 964 001348 DW XISQUOTE 965 001348 DB 3,'OK ' ; for prefix prompt style 966 001348 DW ITYPE 967 001348 ENDIF 968 001348 .... DW EXIT 969 00134A 970 00134A ; C PROMPT -- prompt user 971 00134A HEADLESS PROMPT,DOCOLON 971.1 000000 PUBLIC PROMPT 971.2 00134A IF 'DOCOLON'='DOCODE' 971.3 00134A PROMPT: DW $+2 971.4 00134A ELSE 971.5 00134A .... PROMPT: DW DOCOLON 971.6 00134C ENDIF 971.7 00134C ENDM 972 00134C IF PREFIXPROMPT!=1 973 00134C ............* DW STATE,FETCH,ZEROEQUAL,qbran 974 001354 DEST PROMPT1 974.1 001354 0A00 DW PROMPT1-$ 974.2 001356 ENDM 975 001356 .... DW XISQUOTE 976 001358 036F6B20 DB 3,'ok ' ; for traditional Forth style 977 00135C .... DW ITYPE 978 00135E ENDIF 979 00135E .... PROMPT1:DW EXIT 980 001360 981 001360 ;C QUIT -- R: i*x -- interpret from kbd 982 001360 ; L0 LP ! R0 RP! 0 STATE ! 983 001360 ; BEGIN 984 001360 ; xon EMIT 985 001360 ; TIB DUP TIBSIZE ACCEPT 986 001360 ; xoff EMIT SPACE 987 001360 ; INTERPRET 988 001360 ; CR STATE @ 0= IF ." OK" THEN 989 001360 ; AGAIN ; 990 001360 HEADER QUIT,4,'QUIT',DOCOLON 990.1 000000 PUBLIC QUIT 990.2 001360 .... DW link 990.3 001362 FF DB 0FFh ; not immediate 990.4 001363 link SET $ 990.5 001363 04 DB 4 990.6 001364 51554954 DB 'QUIT' 990.7 001368 EVEN 990.8 001368 IF 'DOCOLON'='DOCODE' 990.9 001368 QUIT: DW $+2 990.10 001368 ELSE 990.11 001368 .... QUIT: DW DOCOLON 990.12 00136A ENDIF 990.13 00136A ENDM 991 00136A ............ DW L0,LP,STORE 992 001370 ............* DW RZERO,RPSTORE,ZERO,STATE,STORE 993 00137A .... QUIT1: DW DOTSTATUS 994 00137C ............* DW TIB,DUP,TIBSIZE,ACCEPT 995 001384 ; DW lit,13H,EMIT ; send XOFF 996 001384 .... DW SPACE 997 001386 .... DW INTERPRET 998 001388 .... DW PROMPT 999 00138A .... DW bran 1000 00138C DEST QUIT1 1000.1 00138C EEFF DW QUIT1-$ 1000.2 00138E ENDM 1001 000000 PUBLIC QUITIP 1002 00138E QUITIP equ QUIT+2 1003 00138E 1004 00138E 1005 00138E 1006 00138E ;C ABORT i*x -- R: j*x -- clear stk & QUIT 1007 00138E ; S0 SP! QUIT ; 1008 00138E HEADER ABORT,5,'ABORT',DOCOLON 1008.1 000000 PUBLIC ABORT 1008.2 00138E .... DW link 1008.3 001390 FF DB 0FFh ; not immediate 1008.4 001391 link SET $ 1008.5 001391 05 DB 5 1008.6 001392 41424F5254 DB 'ABORT' 1008.7 001397 00 EVEN 1008.8 001398 IF 'DOCOLON'='DOCODE' 1008.9 001398 ABORT: DW $+2 1008.10 001398 ELSE 1008.11 001398 .... ABORT: DW DOCOLON 1008.12 00139A ENDIF 1008.13 00139A ENDM 1009 00139A ............ DW S0,SPSTORE,QUIT ; QUIT never returns 1010 0013A0 1011 0013A0 ;Z ?ABORT f c-addr u -- abort & print msg 1012 0013A0 ; ROT IF ITYPE ABORT THEN 2DROP ; 1013 0013A0 HEADER QABORT,6,'?ABORT',DOCOLON 1013.1 000000 PUBLIC QABORT 1013.2 0013A0 .... DW link 1013.3 0013A2 FF DB 0FFh ; not immediate 1013.4 0013A3 link SET $ 1013.5 0013A3 06 DB 6 1013.6 0013A4 3F41424F5254 DB '?ABORT' 1013.7 0013AA EVEN 1013.8 0013AA IF 'DOCOLON'='DOCODE' 1013.9 0013AA QABORT: DW $+2 1013.10 0013AA ELSE 1013.11 0013AA .... QABORT: DW DOCOLON 1013.12 0013AC ENDIF 1013.13 0013AC ENDM 1014 0013AC ........ DW ROT,qbran 1015 0013B0 DEST QABO1 1015.1 0013B0 0600 DW QABO1-$ 1015.2 0013B2 ENDM 1016 0013B2 ........ DW ITYPE,ABORT 1017 0013B6 ........ QABO1: DW TWODROP,EXIT 1018 0013BA 1019 0013BA ;C ABORT" i*x 0 -- i*x R: j*x -- j*x x1=0 1020 0013BA ;C ABORT" i*x x1 -- R: j*x -- x1<>0 1021 0013BA ; POSTPONE IS" POSTPONE ?ABORT ; IMMEDIATE 1022 0013BA IMMED ABORTQUOTE,6,'ABORT"',DOCOLON 1022.1 000000 PUBLIC ABORTQUOTE 1022.2 0013BA .... DW link 1022.3 0013BC FE DB 0FEh // ; immediate (LSB=0 ) 1022.4 0013BD link SET $ 1022.5 0013BD 06 DB 6 1022.6 0013BE 41424F525422 DB 'ABORT"' 1022.7 0013C4 EVEN 1022.8 0013C4 IF 'DOCOLON'='DOCODE' 1022.9 0013C4 ABORTQUOTE: DW $+2 1022.10 0013C4 ELSE 1022.11 0013C4 .... ABORTQUOTE: DW DOCOLON 1022.12 0013C6 ENDIF 1022.13 0013C6 ENDM 1023 0013C6 .... DW ISQUOTE 1024 0013C8 ............ DW lit,QABORT,COMMAXT 1025 0013CE .... DW EXIT 1026 0013D0 1027 0013D0 ;C ' -- xt find word in dictionary 1028 0013D0 ; BL WORD CAPITALIZE FIND 1029 0013D0 ; 0= ABORT" ?" ; 1030 0013D0 HEADER TICK,1,27h,DOCOLON 1030.1 000000 PUBLIC TICK 1030.2 0013D0 .... DW link 1030.3 0013D2 FF DB 0FFh ; not immediate 1030.4 0013D3 link SET $ 1030.5 0013D3 01 DB 1 1030.6 0013D4 27 DB 27h 1030.7 0013D5 00 EVEN 1030.8 0013D6 IF 'DOCOLON'='DOCODE' 1030.9 0013D6 TICK: DW $+2 1030.10 0013D6 ELSE 1030.11 0013D6 .... TICK: DW DOCOLON 1030.12 0013D8 ENDIF 1030.13 0013D8 ENDM 1031 0013D8 ............* DW BLANK,WORDD,CAPITALIZE,FIND,ZEROEQUAL ,XISQUOTE 1032 0013E4 013F DB 1,'?' 1033 0013E6 ........ DW QABORT,EXIT 1034 0013EA 1035 0013EA ;C CHAR -- char parse ASCII character 1036 0013EA ; BL WORD 1+ C@ ; 1037 0013EA HEADER CHARR,4,'CHAR',DOCOLON 1037.1 000000 PUBLIC CHARR 1037.2 0013EA .... DW link 1037.3 0013EC FF DB 0FFh ; not immediate 1037.4 0013ED link SET $ 1037.5 0013ED 04 DB 4 1037.6 0013EE 43484152 DB 'CHAR' 1037.7 0013F2 EVEN 1037.8 0013F2 IF 'DOCOLON'='DOCODE' 1037.9 0013F2 CHARR: DW $+2 1037.10 0013F2 ELSE 1037.11 0013F2 .... CHARR: DW DOCOLON 1037.12 0013F4 ENDIF 1037.13 0013F4 ENDM 1038 0013F4 ............* DW BLANK,WORDD,ONEPLUS,CFETCH,EXIT 1039 0013FE 1040 0013FE ;C [CHAR] -- compile character literal 1041 0013FE ; CHAR ['] LIT ,XT I, ; IMMEDIATE 1042 0013FE IMMED BRACCHAR,6,'[CHAR]',DOCOLON 1042.1 000000 PUBLIC BRACCHAR 1042.2 0013FE .... DW link 1042.3 001400 FE DB 0FEh // ; immediate (LSB=0) 1042.4 001401 link SET $ 1042.5 001401 06 DB 6 1042.6 001402 5B434841525D DB '[CHAR]' 1042.7 001408 EVEN 1042.8 001408 IF 'DOCOLON'='DOCODE' 1042.9 001408 BRACCHAR: DW $+2 1042.10 001408 ELSE 1042.11 001408 .... BRACCHAR: DW DOCOLON 1042.12 00140A ENDIF 1042.13 00140A ENDM 1043 00140A .... DW CHARR 1044 00140C ............ DW lit,lit,COMMAXT 1045 001412 ........ DW ICOMMA,EXIT 1046 001416 1047 001416 ;C ( -- skip input until ) 1048 001416 ; [ HEX ] 29 WORD DROP ; IMMEDIATE 1049 001416 IMMED PAREN,1,'(',DOCOLON 1049.1 000000 PUBLIC PAREN 1049.2 001416 .... DW link 1049.3 001418 FE DB 0FEh // ; immediate (LSB=0) 1049.4 001419 link SET $ 1049.5 001419 01 DB 1 1049.6 00141A 28 DB '(' 1049.7 00141B 00 EVEN 1049.8 00141C IF 'DOCOLON'='DOCODE' 1049.9 00141C PAREN: DW $+2 1049.10 00141C ELSE 1049.11 00141C .... PAREN: DW DOCOLON 1049.12 00141E ENDIF 1049.13 00141E ENDM 1050 00141E ....2900....* DW lit,29H,WORDD,DROP,EXIT 1051 001428 1052 001428 ; COMPILER ===================================== = 1053 001428 1054 001428 ;Z HEADER -- create a Forth word header 1055 001428 ; LATEST @ H, 0FF HC, link & IMMED field 1056 001428 ; HHERE LATEST ! new "latest" link 1057 001428 ; BL HWORD HC@ 1+ HALLOT name field 1058 001428 ; ALIGN ; 1059 001428 ; Separate headers model. 1060 001428 HEADER HEADR,6,'HEADER',DOCOLON 1060.1 000000 PUBLIC HEADR 1060.2 001428 .... DW link 1060.3 00142A FF DB 0FFh ; not immediate 1060.4 00142B link SET $ 1060.5 00142B 06 DB 6 1060.6 00142C 484541444552 DB 'HEADER' 1060.7 001432 EVEN 1060.8 001432 IF 'DOCOLON'='DOCODE' 1060.9 001432 HEADR: DW $+2 1060.10 001432 ELSE 1060.11 001432 .... HEADR: DW DOCOLON 1060.12 001434 ENDIF 1060.13 001434 ENDM 1061 001434 ............ DW LATEST,FETCH,HCOMMA ; link 1062 00143A ....FF00.... DW lit,0FFh,HCCOMMA ; immediate flag - see note below 1063 001440 ............ DW HHERE,LATEST,STORE 1064 001446 ............* DW BLANK,HWORD,HCFETCH,ONEPLUS,HALLOT 1065 001450 ........ DW ALIGNN,EXIT ; MSP430: headers in I space must be aligned 1066 001454 ; Note for Flashable MSP430: when compiling to RAM, we need to set 1067 001454 ; the immediate byte to 0FFH. When compiling to Flash, the word IC! 1068 001454 ; will not write 0FFH to erased Flash (because the byte is already 0FFH). 1069 001454 ; Thus we can write this byte at a later time (with IMMEDIATE). 1070 001454 1071 001454 ;Z ) -- run-time action of DOES> 1088 001486 ; R> adrs of headless DOES> def'n 1089 001486 ; LATEST @ NFA>CFA code field to fix up 1090 001486 ; !CF ; 1091 001486 HEADER XDOES,7,'(DOES>)',DOCOLON 1091.1 000000 PUBLIC XDOES 1091.2 001486 .... DW link 1091.3 001488 FF DB 0FFh ; not immediate 1091.4 001489 link SET $ 1091.5 001489 07 DB 7 1091.6 00148A 28444F45533E* DB '(DOES>)' 1091.7 001491 00 EVEN 1091.8 001492 IF 'DOCOLON'='DOCODE' 1091.9 001492 XDOES: DW $+2 1091.10 001492 ELSE 1091.11 001492 .... XDOES: DW DOCOLON 1091.12 001494 ENDIF 1091.13 001494 ENDM 1092 001494 ............* DW RFROM,LATEST,FETCH,NFATOCFA,STORECF 1093 00149E .... DW EXIT 1094 0014A0 1095 0014A0 ;C DOES> -- change action of latest def'n 1096 0014A0 ; COMPILE (DOES>) 1097 0014A0 ; dodoes ,JMP ; IMMEDIATE 1098 0014A0 ; Note that MSP430 uses a JMP, not a CALL, to DODOES. 1099 0014A0 IMMED DOES,5,'DOES>',DOCOLON 1099.1 000000 PUBLIC DOES 1099.2 0014A0 .... DW link 1099.3 0014A2 FE DB 0FEh // ; immediate (LSB=0) 1099.4 0014A3 link SET $ 1099.5 0014A3 05 DB 5 1099.6 0014A4 444F45533E DB 'DOES>' 1099.7 0014A9 00 EVEN 1099.8 0014AA IF 'DOCOLON'='DOCODE' 1099.9 0014AA DOES: DW $+2 1099.10 0014AA ELSE 1099.11 0014AA .... DOES: DW DOCOLON 1099.12 0014AC ENDIF 1099.13 0014AC ENDM 1100 0014AC ............ DW lit,XDOES,COMMAXT 1101 0014B2 ............* DW lit,dodoes,COMMAJMP,EXIT 1102 0014BA 1103 0014BA ;C RECURSE -- recurse current definition 1104 0014BA ; LATEST @ NFA>CFA ,XT ; IMMEDIATE 1105 0014BA ; NEWEST @ NFA>CFA ,XT ; IMMEDIATE Flashable 1106 0014BA IMMED RECURSE,7,'RECURSE',DOCOLON 1106.1 000000 PUBLIC RECURSE 1106.2 0014BA .... DW link 1106.3 0014BC FE DB 0FEh // ; immediate (LSB=0) 1106.4 0014BD link SET $ 1106.5 0014BD 07 DB 7 1106.6 0014BE 524543555253* DB 'RECURSE' 1106.7 0014C5 00 EVEN 1106.8 0014C6 IF 'DOCOLON'='DOCODE' 1106.9 0014C6 RECURSE: DW $+2 1106.10 0014C6 ELSE 1106.11 0014C6 .... RECURSE: DW DOCOLON 1106.12 0014C8 ENDIF 1106.13 0014C8 ENDM 1107 0014C8 ............* DW NEWEST,FETCH,NFATOCFA,COMMAXT,EXIT 1108 0014D2 1109 0014D2 ;C [ -- enter interpretive state 1110 0014D2 ; 0 STATE ! ; IMMEDIATE 1111 0014D2 IMMED LEFTBRACKET,1,'[',DOCOLON 1111.1 000000 PUBLIC LEFTBRACKET 1111.2 0014D2 .... DW link 1111.3 0014D4 FE DB 0FEh // ; immediate (LSB=0) 1111.4 0014D5 link SET $ 1111.5 0014D5 01 DB 1 1111.6 0014D6 5B DB '[' 1111.7 0014D7 00 EVEN 1111.8 0014D8 IF 'DOCOLON'='DOCODE' 1111.9 0014D8 LEFTBRACKET: DW $+2 1111.10 0014D8 ELSE 1111.11 0014D8 .... LEFTBRACKET: DW DOCOLON 1111.12 0014DA ENDIF 1111.13 0014DA ENDM 1112 0014DA ............* DW ZERO,STATE,STORE,EXIT 1113 0014E2 1114 0014E2 ;C ] -- enter compiling state 1115 0014E2 ; -1 STATE ! ; 1116 0014E2 HEADER RIGHTBRACKET,1,']',DOCOLON 1116.1 000000 PUBLIC RIGHTBRACKET 1116.2 0014E2 .... DW link 1116.3 0014E4 FF DB 0FFh ; not immediate 1116.4 0014E5 link SET $ 1116.5 0014E5 01 DB 1 1116.6 0014E6 5D DB ']' 1116.7 0014E7 00 EVEN 1116.8 0014E8 IF 'DOCOLON'='DOCODE' 1116.9 0014E8 RIGHTBRACKET: DW $+2 1116.10 0014E8 ELSE 1116.11 0014E8 .... RIGHTBRACKET: DW DOCOLON 1116.12 0014EA ENDIF 1116.13 0014EA ENDM 1117 0014EA ....FFFF....* DW lit,-1,STATE,STORE,EXIT 1118 0014F4 1119 0014F4 ;Z HIDE -- "hide" latest definition Flashable 1120 0014F4 ; LATEST @ DUP NEWEST ! NFA>LFA H@ LATEST ! ; 1121 0014F4 HEADER HIDE,4,'HIDE',DOCOLON 1121.1 000000 PUBLIC HIDE 1121.2 0014F4 .... DW link 1121.3 0014F6 FF DB 0FFh ; not immediate 1121.4 0014F7 link SET $ 1121.5 0014F7 04 DB 4 1121.6 0014F8 48494445 DB 'HIDE' 1121.7 0014FC EVEN 1121.8 0014FC IF 'DOCOLON'='DOCODE' 1121.9 0014FC HIDE: DW $+2 1121.10 0014FC ELSE 1121.11 0014FC .... HIDE: DW DOCOLON 1121.12 0014FE ENDIF 1121.13 0014FE ENDM 1122 0014FE ............* DW LATEST,FETCH,DUP,NEWEST,STORE 1123 001508 ............* DW NFATOLFA,HFETCH,LATEST,STORE,EXIT 1124 001512 1125 001512 ;Z REVEAL -- "reveal" latest definition Flashable 1126 001512 ; NEWEST @ LATEST ! ; 1127 001512 HEADER REVEAL,6,'REVEAL',DOCOLON 1127.1 000000 PUBLIC REVEAL 1127.2 001512 .... DW link 1127.3 001514 FF DB 0FFh ; not immediate 1127.4 001515 link SET $ 1127.5 001515 06 DB 6 1127.6 001516 52455645414C DB 'REVEAL' 1127.7 00151C EVEN 1127.8 00151C IF 'DOCOLON'='DOCODE' 1127.9 00151C REVEAL: DW $+2 1127.10 00151C ELSE 1127.11 00151C .... REVEAL: DW DOCOLON 1127.12 00151E ENDIF 1127.13 00151E ENDM 1128 00151E ............* DW NEWEST,FETCH,LATEST,STORE,EXIT 1129 001528 1130 001528 ;C IMMEDIATE -- make last def'n immediate 1131 001528 ; 0FE LATEST @ 1- HC! ; set Flashable immediate flag 1132 001528 HEADER IMMEDIATE,9,'IMMEDIATE',DOCOLON 1132.1 000000 PUBLIC IMMEDIATE 1132.2 001528 .... DW link 1132.3 00152A FF DB 0FFh ; not immediate 1132.4 00152B link SET $ 1132.5 00152B 09 DB 9 1132.6 00152C 494D4D454449* DB 'IMMEDIATE' 1132.7 001535 00 EVEN 1132.8 001536 IF 'DOCOLON'='DOCODE' 1132.9 001536 IMMEDIATE: DW $+2 1132.10 001536 ELSE 1132.11 001536 .... IMMEDIATE: DW DOCOLON 1132.12 001538 ENDIF 1132.13 001538 ENDM 1133 001538 ....FE00....* DW lit,0FEh,LATEST,FETCH,ONEMINUS,HCSTOR E 1134 001544 .... DW EXIT 1135 001546 1136 001546 ;C : -- begin a colon definition 1137 001546 ; DUP CELL+ >R @ ,XT ; 1184 0015B8 ; The phrase ['] xxx ,XT appears so often that 1185 0015B8 ; this word was created to combine the actions 1186 0015B8 ; of LIT and ,XT. It takes an inline literal 1187 0015B8 ; execution token and appends it to the dict. 1188 0015B8 ; HEADER COMPILE,7,'COMPILE',DOCOLON 1189 0015B8 ; DW RFROM,DUP,CELLPLUS,TOR 1190 0015B8 ; DW FETCH,COMMAXT,EXIT 1191 0015B8 ; N.B.: not used in the current implementation 1192 0015B8 1193 0015B8 ; CONTROL STRUCTURES =========================== = 1194 0015B8 1195 0015B8 ;C IF -- adrs conditional forward branch 1196 0015B8 ; ['] qbran ,BRANCH IHERE ,NONE ; Flashable 1197 0015B8 ; IMMEDIATE 1198 0015B8 IMMED IFF,2,'IF',DOCOLON 1198.1 000000 PUBLIC IFF 1198.2 0015B8 .... DW link 1198.3 0015BA FE DB 0FEh // ; immediate (LSB=0) 1198.4 0015BB link SET $ 1198.5 0015BB 02 DB 2 1198.6 0015BC 4946 DB 'IF' 1198.7 0015BE EVEN 1198.8 0015BE IF 'DOCOLON'='DOCODE' 1198.9 0015BE IFF: DW $+2 1198.10 0015BE ELSE 1198.11 0015BE .... IFF: DW DOCOLON 1198.12 0015C0 ENDIF 1198.13 0015C0 ENDM 1199 0015C0 ............ DW lit,qbran,COMMABRANCH 1200 0015C6 ............ DW IHERE,COMMANONE,EXIT 1201 0015CC 1202 0015CC ;C THEN adrs -- resolve forward branch 1203 0015CC ; IHERE SWAP !DEST ; IMMEDIATE 1204 0015CC IMMED THEN,4,'THEN',DOCOLON 1204.1 000000 PUBLIC THEN 1204.2 0015CC .... DW link 1204.3 0015CE FE DB 0FEh // ; immediate (LSB=0) 1204.4 0015CF link SET $ 1204.5 0015CF 04 DB 4 1204.6 0015D0 5448454E DB 'THEN' 1204.7 0015D4 EVEN 1204.8 0015D4 IF 'DOCOLON'='DOCODE' 1204.9 0015D4 THEN: DW $+2 1204.10 0015D4 ELSE 1204.11 0015D4 .... THEN: DW DOCOLON 1204.12 0015D6 ENDIF 1204.13 0015D6 ENDM 1205 0015D6 ............* DW IHERE,SWAP,STOREDEST,EXIT 1206 0015DE 1207 0015DE ;C ELSE adrs1 -- adrs2 branch for IF..ELSE 1208 0015DE ; ['] branch ,BRANCH IHERE ,NONE Flashable 1209 0015DE ; SWAP POSTPONE THEN ; IMMEDIATE 1210 0015DE IMMED ELSS,4,'ELSE',DOCOLON 1210.1 000000 PUBLIC ELSS 1210.2 0015DE .... DW link 1210.3 0015E0 FE DB 0FEh // ; immediate (LSB=0) 1210.4 0015E1 link SET $ 1210.5 0015E1 04 DB 4 1210.6 0015E2 454C5345 DB 'ELSE' 1210.7 0015E6 EVEN 1210.8 0015E6 IF 'DOCOLON'='DOCODE' 1210.9 0015E6 ELSS: DW $+2 1210.10 0015E6 ELSE 1210.11 0015E6 .... ELSS: DW DOCOLON 1210.12 0015E8 ENDIF 1210.13 0015E8 ENDM 1211 0015E8 ............ DW lit,bran,COMMABRANCH 1212 0015EE ........ DW IHERE,COMMANONE 1213 0015F2 ............ DW SWAP,THEN,EXIT 1214 0015F8 1215 0015F8 ;C BEGIN -- adrs target for bwd. branch 1216 0015F8 ; IHERE ; IMMEDIATE 1217 0015F8 IMMED BEGIN,5,'BEGIN',DOCOLON 1217.1 000000 PUBLIC BEGIN 1217.2 0015F8 .... DW link 1217.3 0015FA FE DB 0FEh // ; immediate (LSB=0) 1217.4 0015FB link SET $ 1217.5 0015FB 05 DB 5 1217.6 0015FC 424547494E DB 'BEGIN' 1217.7 001601 00 EVEN 1217.8 001602 IF 'DOCOLON'='DOCODE' 1217.9 001602 BEGIN: DW $+2 1217.10 001602 ELSE 1217.11 001602 .... BEGIN: DW DOCOLON 1217.12 001604 ENDIF 1217.13 001604 ENDM 1218 001604 ........ DW IHERE,EXIT 1219 001608 1220 001608 ;C UNTIL adrs -- conditional backward branch 1221 001608 ; ['] qbran ,BRANCH ,DEST ; IMMEDIATE 1222 001608 ; conditional backward branch 1223 001608 IMMED UNTIL,5,'UNTIL',DOCOLON 1223.1 000000 PUBLIC UNTIL 1223.2 001608 .... DW link 1223.3 00160A FE DB 0FEh // ; immediate (LSB=0) 1223.4 00160B link SET $ 1223.5 00160B 05 DB 5 1223.6 00160C 554E54494C DB 'UNTIL' 1223.7 001611 00 EVEN 1223.8 001612 IF 'DOCOLON'='DOCODE' 1223.9 001612 UNTIL: DW $+2 1223.10 001612 ELSE 1223.11 001612 .... UNTIL: DW DOCOLON 1223.12 001614 ENDIF 1223.13 001614 ENDM 1224 001614 ............ DW lit,qbran,COMMABRANCH 1225 00161A ........ DW COMMADEST,EXIT 1226 00161E 1227 00161E ;X AGAIN adrs -- uncond'l backward branch 1228 00161E ; ['] branch ,BRANCH ,DEST ; IMMEDIATE 1229 00161E ; unconditional backward branch 1230 00161E IMMED AGAIN,5,'AGAIN',DOCOLON 1230.1 000000 PUBLIC AGAIN 1230.2 00161E .... DW link 1230.3 001620 FE DB 0FEh // ; immediate (LSB=0) 1230.4 001621 link SET $ 1230.5 001621 05 DB 5 1230.6 001622 414741494E DB 'AGAIN' 1230.7 001627 00 EVEN 1230.8 001628 IF 'DOCOLON'='DOCODE' 1230.9 001628 AGAIN: DW $+2 1230.10 001628 ELSE 1230.11 001628 .... AGAIN: DW DOCOLON 1230.12 00162A ENDIF 1230.13 00162A ENDM 1231 00162A ............ DW lit,bran,COMMABRANCH 1232 001630 ........ DW COMMADEST,EXIT 1233 001634 1234 001634 ;C WHILE adrs1 -- adrs2 adrs1 branch for WHILE loop 1235 001634 ; POSTPONE IF SWAP ; IMMEDIATE 1236 001634 IMMED WHILE,5,'WHILE',DOCOLON 1236.1 000000 PUBLIC WHILE 1236.2 001634 .... DW link 1236.3 001636 FE DB 0FEh // ; immediate (LSB=0) 1236.4 001637 link SET $ 1236.5 001637 05 DB 5 1236.6 001638 5748494C45 DB 'WHILE' 1236.7 00163D 00 EVEN 1236.8 00163E IF 'DOCOLON'='DOCODE' 1236.9 00163E WHILE: DW $+2 1236.10 00163E ELSE 1236.11 00163E .... WHILE: DW DOCOLON 1236.12 001640 ENDIF 1236.13 001640 ENDM 1237 001640 ............ DW IFF,SWAP,EXIT 1238 001646 1239 001646 ;C REPEAT adrs2 adrs1 -- resolve WHILE loop 1240 001646 ; POSTPONE AGAIN POSTPONE THEN ; IMMEDIATE 1241 001646 IMMED REPEAT,6,'REPEAT',DOCOLON 1241.1 000000 PUBLIC REPEAT 1241.2 001646 .... DW link 1241.3 001648 FE DB 0FEh // ; immediate (LSB=0) 1241.4 001649 link SET $ 1241.5 001649 06 DB 6 1241.6 00164A 524550454154 DB 'REPEAT' 1241.7 001650 EVEN 1241.8 001650 IF 'DOCOLON'='DOCODE' 1241.9 001650 REPEAT: DW $+2 1241.10 001650 ELSE 1241.11 001650 .... REPEAT: DW DOCOLON 1241.12 001652 ENDIF 1241.13 001652 ENDM 1242 001652 ............ DW AGAIN,THEN,EXIT 1243 001658 1244 001658 ;Z >L x -- L: -- x move to leave stack 1245 001658 ; CELL LP +! LP @ ! ; (L stack grows up) 1246 001658 HEADER TOL,2,'>L',DOCOLON 1246.1 000000 PUBLIC TOL 1246.2 001658 .... DW link 1246.3 00165A FF DB 0FFh ; not immediate 1246.4 00165B link SET $ 1246.5 00165B 02 DB 2 1246.6 00165C 3E4C DB '>L' 1246.7 00165E EVEN 1246.8 00165E IF 'DOCOLON'='DOCODE' 1246.9 00165E TOL: DW $+2 1246.10 00165E ELSE 1246.11 00165E .... TOL: DW DOCOLON 1246.12 001660 ENDIF 1246.13 001660 ENDM 1247 001660 ............* DW CELL,LP,PLUSSTORE,LP,FETCH,STORE,EXIT 1248 00166E 1249 00166E ;Z L> -- x L: x -- move from leave stack 1250 00166E ; LP @ @ CELL NEGATE LP +! ; 1251 00166E HEADER LFROM,2,'L>',DOCOLON 1251.1 000000 PUBLIC LFROM 1251.2 00166E .... DW link 1251.3 001670 FF DB 0FFh ; not immediate 1251.4 001671 link SET $ 1251.5 001671 02 DB 2 1251.6 001672 4C3E DB 'L>' 1251.7 001674 EVEN 1251.8 001674 IF 'DOCOLON'='DOCODE' 1251.9 001674 LFROM: DW $+2 1251.10 001674 ELSE 1251.11 001674 .... LFROM: DW DOCOLON 1251.12 001676 ENDIF 1251.13 001676 ENDM 1252 001676 ............ DW LP,FETCH,FETCH 1253 00167C ............* DW CELL,NEGATE,LP,PLUSSTORE,EXIT 1254 001686 1255 001686 ;C DO -- adrs L: -- 0 start a loop 1256 001686 ; ['] xdo ,XT IHERE target for bwd branch 1257 001686 ; 0 >L ; IMMEDIATE marker for LEAVEs 1258 001686 IMMED DO,2,'DO',DOCOLON 1258.1 000000 PUBLIC DO 1258.2 001686 .... DW link 1258.3 001688 FE DB 0FEh // ; immediate (LSB=0) 1258.4 001689 link SET $ 1258.5 001689 02 DB 2 1258.6 00168A 444F DB 'DO' 1258.7 00168C EVEN 1258.8 00168C IF 'DOCOLON'='DOCODE' 1258.9 00168C DO: DW $+2 1258.10 00168C ELSE 1258.11 00168C .... DO: DW DOCOLON 1258.12 00168E ENDIF 1258.13 00168E ENDM 1259 00168E ............* DW lit,xdo,COMMAXT,IHERE 1260 001696 ............ DW ZERO,TOL,EXIT 1261 00169C 1262 00169C ;Z ENDLOOP adrs xt -- L: 0 a1 a2 .. aN -- common factor of LOOP and +LOOP 1263 00169C ; ,BRANCH ,DEST backward loop 1264 00169C ; BEGIN L> ?DUP WHILE POSTPONE THEN REPEAT ; 1265 00169C ; resolve LEAVEs 1266 00169C ; This is a common factor of LOOP and +LOOP. 1267 00169C HEADER ENDLOOP,7,'ENDLOOP',DOCOLON 1267.1 000000 PUBLIC ENDLOOP 1267.2 00169C .... DW link 1267.3 00169E FF DB 0FFh ; not immediate 1267.4 00169F link SET $ 1267.5 00169F 07 DB 7 1267.6 0016A0 454E444C4F4F* DB 'ENDLOOP' 1267.7 0016A7 00 EVEN 1267.8 0016A8 IF 'DOCOLON'='DOCODE' 1267.9 0016A8 ENDLOOP: DW $+2 1267.10 0016A8 ELSE 1267.11 0016A8 .... ENDLOOP: DW DOCOLON 1267.12 0016AA ENDIF 1267.13 0016AA ENDM 1268 0016AA ........ DW COMMABRANCH,COMMADEST 1269 0016AE ............ LOOP1: DW LFROM,QDUP,qbran 1270 0016B4 DEST LOOP2 1270.1 0016B4 0800 DW LOOP2-$ 1270.2 0016B6 ENDM 1271 0016B6 ........ DW THEN,bran 1272 0016BA DEST LOOP1 1272.1 0016BA F4FF DW LOOP1-$ 1272.2 0016BC ENDM 1273 0016BC .... LOOP2: DW EXIT 1274 0016BE 1275 0016BE ;C LOOP adrs -- L: 0 a1 a2 .. aN -- finish a loop 1276 0016BE ; ['] xloop ENDLOOP ; IMMEDIATE 1277 0016BE IMMED LOO,4,'LOOP',DOCOLON 1277.1 000000 PUBLIC LOO 1277.2 0016BE .... DW link 1277.3 0016C0 FE DB 0FEh // ; immediate (LSB=0) 1277.4 0016C1 link SET $ 1277.5 0016C1 04 DB 4 1277.6 0016C2 4C4F4F50 DB 'LOOP' 1277.7 0016C6 EVEN 1277.8 0016C6 IF 'DOCOLON'='DOCODE' 1277.9 0016C6 LOO: DW $+2 1277.10 0016C6 ELSE 1277.11 0016C6 .... LOO: DW DOCOLON 1277.12 0016C8 ENDIF 1277.13 0016C8 ENDM 1278 0016C8 ............* DW lit,xloop,ENDLOOP,EXIT 1279 0016D0 1280 0016D0 ;C +LOOP adrs -- L: 0 a1 a2 .. aN -- finish a loop 1281 0016D0 ; ['] xplusloop ENDLOOP ; IMMEDIATE 1282 0016D0 IMMED PLUSLOOP,5,'+LOOP',DOCOLON 1282.1 000000 PUBLIC PLUSLOOP 1282.2 0016D0 .... DW link 1282.3 0016D2 FE DB 0FEh // ; immediate (LSB=0) 1282.4 0016D3 link SET $ 1282.5 0016D3 05 DB 5 1282.6 0016D4 2B4C4F4F50 DB '+LOOP' 1282.7 0016D9 00 EVEN 1282.8 0016DA IF 'DOCOLON'='DOCODE' 1282.9 0016DA PLUSLOOP: DW $+2 1282.10 0016DA ELSE 1282.11 0016DA .... PLUSLOOP: DW DOCOLON 1282.12 0016DC ENDIF 1282.13 0016DC ENDM 1283 0016DC ............* DW lit,xplusloop,ENDLOOP,EXIT 1284 0016E4 1285 0016E4 ;C LEAVE -- L: -- adrs 1286 0016E4 ; ['] UNLOOP ,XT 1287 0016E4 ; ['] branch ,BRANCH IHERE ,NONE >L 1288 0016E4 ; ; IMMEDIATE unconditional forward branch 1289 0016E4 IMMED LEAV,5,'LEAVE',DOCOLON 1289.1 000000 PUBLIC LEAV 1289.2 0016E4 .... DW link 1289.3 0016E6 FE DB 0FEh // ; immediate (LSB=0) 1289.4 0016E7 link SET $ 1289.5 0016E7 05 DB 5 1289.6 0016E8 4C45415645 DB 'LEAVE' 1289.7 0016ED 00 EVEN 1289.8 0016EE IF 'DOCOLON'='DOCODE' 1289.9 0016EE LEAV: DW $+2 1289.10 0016EE ELSE 1289.11 0016EE .... LEAV: DW DOCOLON 1289.12 0016F0 ENDIF 1289.13 0016F0 ENDM 1290 0016F0 ............ DW lit,UNLOOP,COMMAXT 1291 0016F6 ............ DW lit,bran,COMMABRANCH 1292 0016FC ............* DW IHERE,COMMANONE,TOL,EXIT 1293 001704 1294 001704 ; OTHER OPERATIONS ============================= = 1295 001704 1296 001704 ;X WITHIN n1|u1 n2|u2 n3|u3 -- f n2<=n1R - R> U< ; per ANS document 1298 001704 HEADER WITHIN,6,'WITHIN',DOCOLON 1298.1 000000 PUBLIC WITHIN 1298.2 001704 .... DW link 1298.3 001706 FF DB 0FFh ; not immediate 1298.4 001707 link SET $ 1298.5 001707 06 DB 6 1298.6 001708 57495448494E DB 'WITHIN' 1298.7 00170E EVEN 1298.8 00170E IF 'DOCOLON'='DOCODE' 1298.9 00170E WITHIN: DW $+2 1298.10 00170E ELSE 1298.11 00170E .... WITHIN: DW DOCOLON 1298.12 001710 ENDIF 1298.13 001710 ENDM 1299 001710 ............* DW OVER,MINUS,TOR,MINUS,RFROM,ULESS,EXIT 1300 00171E 1301 00171E ;C MOVE addr1 addr2 u -- smart move 1302 00171E ; VERSION FOR 1 ADDRESS UNIT = 1 CHAR 1303 00171E ; >R 2DUP SWAP DUP R@ + -- ... dst src src+n 1304 00171E ; WITHIN IF R> CMOVE> src <= dst < src+n 1305 00171E ; ELSE R> CMOVE THEN ; otherwise 1306 00171E HEADER MOVE,4,'MOVE',DOCOLON 1306.1 000000 PUBLIC MOVE 1306.2 00171E .... DW link 1306.3 001720 FF DB 0FFh ; not immediate 1306.4 001721 link SET $ 1306.5 001721 04 DB 4 1306.6 001722 4D4F5645 DB 'MOVE' 1306.7 001726 EVEN 1306.8 001726 IF 'DOCOLON'='DOCODE' 1306.9 001726 MOVE: DW $+2 1306.10 001726 ELSE 1306.11 001726 .... MOVE: DW DOCOLON 1306.12 001728 ENDIF 1306.13 001728 ENDM 1307 001728 ............* DW TOR,TWODUP,SWAP,DUP,RFETCH,PLUS 1308 001734 ........ DW WITHIN,qbran 1309 001738 DEST MOVE1 1309.1 001738 0A00 DW MOVE1-$ 1309.2 00173A ENDM 1310 00173A ............ DW RFROM,CMOVEUP,bran 1311 001740 DEST MOVE2 1311.1 001740 0600 DW MOVE2-$ 1311.2 001742 ENDM 1312 001742 ........ MOVE1: DW RFROM,CMOVE 1313 001746 .... MOVE2: DW EXIT 1314 001748 1315 001748 ;C DEPTH -- +n number of items on stack 1316 001748 ; SP@ S0 SWAP - 2/ ; 16-BIT VERSION! 1317 001748 HEADER DEPTH,5,'DEPTH',DOCOLON 1317.1 000000 PUBLIC DEPTH 1317.2 001748 .... DW link 1317.3 00174A FF DB 0FFh ; not immediate 1317.4 00174B link SET $ 1317.5 00174B 05 DB 5 1317.6 00174C 4445505448 DB 'DEPTH' 1317.7 001751 00 EVEN 1317.8 001752 IF 'DOCOLON'='DOCODE' 1317.9 001752 DEPTH: DW $+2 1317.10 001752 ELSE 1317.11 001752 .... DEPTH: DW DOCOLON 1317.12 001754 ENDIF 1317.13 001754 ENDM 1318 001754 ............* DW SPFETCH,S0,SWAP,MINUS,TWOSLASH,EXIT 1319 001760 1320 001760 ;C ENVIRONMENT? c-addr u -- false system query 1321 001760 ; -- i*x true 1322 001760 ; 2DROP 0 ; the minimal definition! 1323 001760 HEADER ENVIRONMENTQ,12,'ENVIRONMENT?',DOCOL ON 1323.1 000000 PUBLIC ENVIRONMENTQ 1323.2 001760 .... DW link 1323.3 001762 FF DB 0FFh ; not immediate 1323.4 001763 link SET $ 1323.5 001763 0C DB 12 1323.6 001764 454E5649524F* DB 'ENVIRONMENT?' 1323.7 001770 EVEN 1323.8 001770 IF 'DOCOLON'='DOCODE' 1323.9 001770 ENVIRONMENTQ: DW $+2 1323.10 001770 ELSE 1323.11 001770 .... ENVIRONMENTQ: DW DOCOLON 1323.12 001772 ENDIF 1323.13 001772 ENDM 1324 001772 ............ DW TWODROP,ZERO,EXIT 1325 001778 1326 001778 ;U UTILITY WORDS ===================== 1327 001778 1328 001778 ;Z NOOP -- do nothing 1329 001778 HEADER NOOP,4,'NOOP',DOCOLON 1329.1 000000 PUBLIC NOOP 1329.2 001778 .... DW link 1329.3 00177A FF DB 0FFh ; not immediate 1329.4 00177B link SET $ 1329.5 00177B 04 DB 4 1329.6 00177C 4E4F4F50 DB 'NOOP' 1329.7 001780 EVEN 1329.8 001780 IF 'DOCOLON'='DOCODE' 1329.9 001780 NOOP: DW $+2 1329.10 001780 ELSE 1329.11 001780 .... NOOP: DW DOCOLON 1329.12 001782 ENDIF 1329.13 001782 ENDM 1330 001782 .... DW EXIT 1331 001784 1332 001784 ;Z FLALIGNED a -- a' align IDP to flash boundary 1333 001784 ; $200 OVER - $1FF AND + ; 1334 001784 HEADER FLALIGNED,9,'FLALIGNED',DOCOLON 1334.1 000000 PUBLIC FLALIGNED 1334.2 001784 .... DW link 1334.3 001786 FF DB 0FFh ; not immediate 1334.4 001787 link SET $ 1334.5 001787 09 DB 9 1334.6 001788 464C414C4947* DB 'FLALIGNED' 1334.7 001791 00 EVEN 1334.8 001792 IF 'DOCOLON'='DOCODE' 1334.9 001792 FLALIGNED: DW $+2 1334.10 001792 ELSE 1334.11 001792 .... FLALIGNED: DW DOCOLON 1334.12 001794 ENDIF 1334.13 001794 ENDM 1335 001794 ....0002....* DW lit,0200h,OVER,MINUS,lit,01FFh,ANDD,P LUS,EXIT 1336 0017A6 1337 0017A6 ;X MARKER -- create word to restore dictionary 1338 0017A6 ; LATEST @ IHERE HERE 1339 0017A6 ; IHERE FLALIGNED IDP ! align new word to flash boundary 1340 0017A6 ; DUP I@ 1342 0017A6 ; SWAP CELL+ DUP I@ 1343 0017A6 ; SWAP CELL+ I@ fetch saved -- dp idp latest 1344 0017A6 ; OVER FLALIGNED IHERE OVER - FLERASE erase Flash from saved to IHERE 1345 0017A6 ; LATEST ! IDP ! DP ! ; 1346 0017A6 HEADER MARKER,6,'MARKER',DOCOLON 1346.1 000000 PUBLIC MARKER 1346.2 0017A6 .... DW link 1346.3 0017A8 FF DB 0FFh ; not immediate 1346.4 0017A9 link SET $ 1346.5 0017A9 06 DB 6 1346.6 0017AA 4D41524B4552 DB 'MARKER' 1346.7 0017B0 EVEN 1346.8 0017B0 IF 'DOCOLON'='DOCODE' 1346.9 0017B0 MARKER: DW $+2 1346.10 0017B0 ELSE 1346.11 0017B0 .... MARKER: DW DOCOLON 1346.12 0017B2 ENDIF 1346.13 0017B2 ENDM 1347 0017B2 ............* DW LATEST,FETCH,IHERE,HERE 1348 0017BA ............* DW IHERE,FLALIGNED,IDP,STORE 1349 0017C2 ............* DW BUILDS,ICOMMA,ICOMMA,ICOMMA,XDOES 1350 0017CC 3040.... MOV #dodoes,PC ; long direct jump to DODOES 1351 0017D0 ........ DW DUP,IFETCH 1352 0017D4 ............* DW SWAP,CELLPLUS,DUP,IFETCH 1353 0017DC ............ DW SWAP,CELLPLUS,IFETCH 1354 0017E2 ............* DW OVER,FLALIGNED,IHERE,OVER,MINUS,FLERA SE 1355 0017EE ............* DW LATEST,STORE,IDP,STORE,DDP,STORE,EXIT 1356 0017FC 1357 0017FC ;X WORDS -- list all words in dict. 1358 0017FC ; LATEST @ BEGIN 1359 0017FC ; DUP HCOUNT 7F AND HTYPE SPACE 1360 0017FC ; NFA>LFA H@ 1361 0017FC ; DUP 0= UNTIL 1362 0017FC ; DROP ; 1363 0017FC HEADER WORDS,5,'WORDS',DOCOLON 1363.1 000000 PUBLIC WORDS 1363.2 0017FC .... DW link 1363.3 0017FE FF DB 0FFh ; not immediate 1363.4 0017FF link SET $ 1363.5 0017FF 05 DB 5 1363.6 001800 574F524453 DB 'WORDS' 1363.7 001805 00 EVEN 1363.8 001806 IF 'DOCOLON'='DOCODE' 1363.9 001806 WORDS: DW $+2 1363.10 001806 ELSE 1363.11 001806 .... WORDS: DW DOCOLON 1363.12 001808 ENDIF 1363.13 001808 ENDM 1364 001808 ........ DW LATEST,FETCH 1365 00180C ............*WDS1: DW DUP,HCOUNT,lit,07FH,ANDD,HTYPE,SPACE 1366 00181A ........ DW NFATOLFA,HFETCH 1367 00181E ............ DW DUP,ZEROEQUAL,qbran 1368 001824 DEST WDS1 1368.1 001824 E8FF DW WDS1-$ 1368.2 001826 ENDM 1369 001826 ........ DW DROP,EXIT 1370 00182A 1371 00182A ;X U.R u n -- display u unsigned in n width 1372 00182A ; >R <# 0 #S #> R> OVER - 0 MAX SPACES TYPE ; 1373 00182A HEADER UDOTR,3,'U.R',DOCOLON 1373.1 000000 PUBLIC UDOTR 1373.2 00182A .... DW link 1373.3 00182C FF DB 0FFh ; not immediate 1373.4 00182D link SET $ 1373.5 00182D 03 DB 3 1373.6 00182E 552E52 DB 'U.R' 1373.7 001831 00 EVEN 1373.8 001832 IF 'DOCOLON'='DOCODE' 1373.9 001832 UDOTR: DW $+2 1373.10 001832 ELSE 1373.11 001832 .... UDOTR: DW DOCOLON 1373.12 001834 ENDIF 1373.13 001834 ENDM 1374 001834 ............* DW TOR,LESSNUM,ZERO,NUMS,NUMGREATER 1375 00183E ............* DW RFROM,OVER,MINUS,ZERO,MAX,SPACES,TYP, EXIT 1376 00184E 1377 00184E ;X DUMP adr n -- dump memory 1378 00184E ; OVER + SWAP DO 1379 00184E ; CR I 4 U.R SPACE SPACE 1380 00184E ; I $10 + I DO I C@ 3 U.R LOOP SPACE SPACE 1381 00184E ; I $10 + I DO I C@ $7F AND $7E MIN BL MAX EMIT LOOP 1382 00184E ; 10 +LOOP ; 1383 00184E HEADER DUMP,4,'DUMP',DOCOLON 1383.1 000000 PUBLIC DUMP 1383.2 00184E .... DW link 1383.3 001850 FF DB 0FFh ; not immediate 1383.4 001851 link SET $ 1383.5 001851 04 DB 4 1383.6 001852 44554D50 DB 'DUMP' 1383.7 001856 EVEN 1383.8 001856 IF 'DOCOLON'='DOCODE' 1383.9 001856 DUMP: DW $+2 1383.10 001856 ELSE 1383.11 001856 .... DUMP: DW DOCOLON 1383.12 001858 ENDIF 1383.13 001858 ENDM 1384 001858 ............* DW OVER,PLUS,SWAP,xdo 1385 001860 ............*LDUMP1: DW CR,II,lit,4,UDOTR,SPACE,SPACE 1386 00186E ........1000* DW II,lit,10h,PLUS,II,xdo 1387 00187A ............*LDUMP2: DW II,CFETCH,lit,3,UDOTR,xloop 1388 001886 DEST LDUMP2 1388.1 001886 F4FF DW LDUMP2-$ 1388.2 001888 ENDM 1389 001888 ........ DW SPACE,SPACE 1390 00188C ........1000* DW II,lit,10h,PLUS,II,xdo 1391 001898 ............*LDUMP3: DW II,CFETCH,lit,7Fh,ANDD,lit,7Eh,MIN,BL ANK,MAX,EMIT,xloop 1392 0018B0 DEST LDUMP3 1392.1 0018B0 E8FF DW LDUMP3-$ 1392.2 0018B2 ENDM 1393 0018B2 ....1000.... DW lit,10h,xplusloop 1394 0018B8 DEST LDUMP1 1394.1 0018B8 A8FF DW LDUMP1-$ 1394.2 0018BA ENDM 1395 0018BA .... DW EXIT 1396 0018BC 1397 0018BC ;X .S -- print stack contents 1398 0018BC ; [char] < EMIT DEPTH . BS [char] > EMIT 1399 0018BC ; SP@ S0 < IF 1400 0018BC ; SP@ S0 2 - DO I @ U. -2 +LOOP 1401 0018BC ; THEN ; 1402 0018BC HEADER DOTS,2,'.S',DOCOLON 1402.1 000000 PUBLIC DOTS 1402.2 0018BC .... DW link 1402.3 0018BE FF DB 0FFh ; not immediate 1402.4 0018BF link SET $ 1402.5 0018BF 02 DB 2 1402.6 0018C0 2E53 DB '.S' 1402.7 0018C2 EVEN 1402.8 0018C2 IF 'DOCOLON'='DOCODE' 1402.9 0018C2 DOTS: DW $+2 1402.10 0018C2 ELSE 1402.11 0018C2 .... DOTS: DW DOCOLON 1402.12 0018C4 ENDIF 1402.13 0018C4 ENDM 1403 0018C4 ;mk gforth style 1404 0018C4 ....3C00.... DW lit,$3C,EMIT 1405 0018CA ........ DW DEPTH,DOT 1406 0018CE ....0800....* DW lit,$08,EMIT,lit,$3E,EMIT,SPACE 1407 0018DC ;/mk 1408 0018DC ............* DW SPFETCH,S0,LESS,qbran 1409 0018E4 DEST DOTS2 1409.1 0018E4 1C00 DW DOTS2-$ 1409.2 0018E6 ENDM 1410 0018E6 ............* DW SPFETCH,S0,lit,2,MINUS,xdo 1411 0018F2 ............*DOTS1: DW II,FETCH,UDOT,lit,-2,xplusloop 1412 0018FE DEST DOTS1 1412.1 0018FE F4FF DW DOTS1-$ 1412.2 001900 ENDM 1413 001900 .... DOTS2: DW EXIT 1414 001902 1415 001902 1416 001902 ;U ccrc n c -- n' crc process byte 1417 001902 ; 8 LSHIFT XOR 1418 001902 ; 8 0 DO ( n' ) 1419 001902 ; DUP 1 LSHIFT SWAP 8000 AND 0= INVERT 1021 ( CRC-16 ) AND XOR 1420 001902 ; LOOP 1421 001902 ; FFFF AND ; 1422 001902 HEADER CCRC,4,'ccrc',DOCOLON 1422.1 000000 PUBLIC CCRC 1422.2 001902 .... DW link 1422.3 001904 FF DB 0FFh ; not immediate 1422.4 001905 link SET $ 1422.5 001905 04 DB 4 1422.6 001906 63637263 DB 'ccrc' 1422.7 00190A EVEN 1422.8 00190A IF 'DOCOLON'='DOCODE' 1422.9 00190A CCRC: DW $+2 1422.10 00190A ELSE 1422.11 00190A .... CCRC: DW DOCOLON 1422.12 00190C ENDIF 1422.13 00190C ENDM 1423 00190C ....0800....* DW lit,8,LSHIFT,XORR 1424 001914 ....0800....* DW lit,8,ZERO,xdo 1425 00191C ........0100*ccrc1: DW DUP,lit,1,LSHIFT,SWAP,lit,08000h,AN DD,ZEROEQUAL 1426 00192E ........2110* DW INVERT,lit,01021h,ANDD,XORR 1427 001938 .... DW xloop 1428 00193A DEST ccrc1 1428.1 00193A E2FF DW ccrc1-$ 1428.2 00193C ENDM 1429 00193C .... DW EXIT 1430 00193E 1431 00193E ;U (crc n addr len -- n' crc process string including previous crc-byte 1432 00193E ; dup IF over + swap DO ( n ) I C@ ccrc LOOP ELSE 2drop THEN ; 1433 00193E HEADER PCRC,4,'(crc',DOCOLON 1433.1 000000 PUBLIC PCRC 1433.2 00193E .... DW link 1433.3 001940 FF DB 0FFh ; not immediate 1433.4 001941 link SET $ 1433.5 001941 04 DB 4 1433.6 001942 28637263 DB '(crc' 1433.7 001946 EVEN 1433.8 001946 IF 'DOCOLON'='DOCODE' 1433.9 001946 PCRC: DW $+2 1433.10 001946 ELSE 1433.11 001946 .... PCRC: DW DOCOLON 1433.12 001948 ENDIF 1433.13 001948 ENDM 1434 001948 ........ DW DUP,qbran 1435 00194C DEST pcrc2 1435.1 00194C 1800 DW pcrc2-$ 1435.2 00194E ENDM 1436 00194E ............* DW OVER,PLUS,SWAP,xdo 1437 001956 ............*pcrc1: DW II,CFETCH,CCRC, xloop 1438 00195E DEST pcrc1 1438.1 00195E F8FF DW pcrc1-$ 1438.2 001960 ENDM 1439 001960 .... DW bran 1440 001962 DEST pcrc3 1440.1 001962 0400 DW pcrc3-$ 1440.2 001964 ENDM 1441 001964 .... pcrc2: DW TWODROP 1442 001966 .... pcrc3: DW EXIT 1443 001968 1444 001968 ;U crc addr len -- n crc process string 1445 001968 HEADER CRC,3,'crc',DOCOLON 1445.1 000000 PUBLIC CRC 1445.2 001968 .... DW link 1445.3 00196A FF DB 0FFh ; not immediate 1445.4 00196B link SET $ 1445.5 00196B 03 DB 3 1445.6 00196C 637263 DB 'crc' 1445.7 00196F 00 EVEN 1445.8 001970 IF 'DOCOLON'='DOCODE' 1445.9 001970 CRC: DW $+2 1445.10 001970 ELSE 1445.11 001970 .... CRC: DW DOCOLON 1445.12 001972 ENDIF 1445.13 001972 ENDM 1446 001972 ............* DW ZERO,ROT,ROT,PCRC,EXIT 1447 00197C 1448 00197C 1449 00197C ;U STARTUP WORDS =============================== ================================ 1450 00197C 1451 00197C ;Z ITHERE -- adr find first free flash cell 1452 00197C ; MEMTOP BEGIN 1- 1453 00197C ; DUP C@ FF <> 1454 00197C ; OVER FL0 < OR UNTIL 1+ ; 1455 00197C HEADER ITHERE,6,'ITHERE',DOCOLON 1455.1 000000 PUBLIC ITHERE 1455.2 00197C .... DW link 1455.3 00197E FF DB 0FFh ; not immediate 1455.4 00197F link SET $ 1455.5 00197F 06 DB 6 1455.6 001980 495448455245 DB 'ITHERE' 1455.7 001986 EVEN 1455.8 001986 IF 'DOCOLON'='DOCODE' 1455.9 001986 ITHERE: DW $+2 1455.10 001986 ELSE 1455.11 001986 .... ITHERE: DW DOCOLON 1455.12 001988 ENDIF 1455.13 001988 ENDM 1456 001988 .... DW MEMTOP 1457 00198A ............*ih1 DW ONEMINUS,DUP,CFETCH,lit,$FF,NOTEQUAL 1458 001996 ........00C0* DW OVER,lit,FLASHSTART,LESS,ORR,qbran 1459 0019A2 DEST ih1 1459.1 0019A2 E8FF DW ih1-$ 1459.2 0019A4 ENDM 1460 0019A4 ........ DW ONEPLUS,EXIT 1461 0019A8 1462 0019A8 ;U APPCRC -- crc CRC of APP-dictionary 1463 0019A8 ; 0 MEMBOT ITHERE OVER - (crc APPU0 #INIT (crc ; 1464 0019A8 HEADER APPCRC,6,'APPCRC',DOCOLON 1464.1 000000 PUBLIC APPCRC 1464.2 0019A8 .... DW link 1464.3 0019AA FF DB 0FFh ; not immediate 1464.4 0019AB link SET $ 1464.5 0019AB 06 DB 6 1464.6 0019AC 415050435243 DB 'APPCRC' 1464.7 0019B2 EVEN 1464.8 0019B2 IF 'DOCOLON'='DOCODE' 1464.9 0019B2 APPCRC: DW $+2 1464.10 0019B2 ELSE 1464.11 0019B2 .... APPCRC: DW DOCOLON 1464.12 0019B4 ENDIF 1464.13 0019B4 ENDM 1465 0019B4 ....0000 DW lit,0 1466 0019B8 ....00C0....* DW lit,FLASHSTART,ITHERE,OVER,MINUS,PCRC 1467 0019C4 ............* DW APPU0,NINIT,PCRC,EXIT 1468 0019CC 1469 000000 EXTERN crcval 1470 0019CC 1471 0019CC ;U VALID? -- f check if user app crc matches infoB 1472 0019CC ; APPCRC crcval I@ = ; 1473 0019CC HEADER VALIDQ,6,'VALID?',DOCOLON 1473.1 000000 PUBLIC VALIDQ 1473.2 0019CC .... DW link 1473.3 0019CE FF DB 0FFh ; not immediate 1473.4 0019CF link SET $ 1473.5 0019CF 06 DB 6 1473.6 0019D0 56414C49443F DB 'VALID?' 1473.7 0019D6 EVEN 1473.8 0019D6 IF 'DOCOLON'='DOCODE' 1473.9 0019D6 VALIDQ: DW $+2 1473.10 0019D6 ELSE 1473.11 0019D6 .... VALIDQ: DW DOCOLON 1473.12 0019D8 ENDIF 1473.13 0019D8 ENDM 1474 0019D8 ............* DW APPCRC,lit,crcval,IFETCH,EQUAL,EXIT 1475 0019E4 1476 0019E4 ;U SAVE -- save user area to infoB 1477 0019E4 ; InfoB [ 63 2 + ] Literal FLERASE 1478 0019E4 ; U0 APPU0 #INIT D->I 1479 0019E4 ; APPCRC [ crcval ] Literal I! ; 1480 0019E4 HEADER SAVE,4,'SAVE',DOCOLON 1480.1 000000 PUBLIC SAVE 1480.2 0019E4 .... DW link 1480.3 0019E6 FF DB 0FFh ; not immediate 1480.4 0019E7 link SET $ 1480.5 0019E7 04 DB 4 1480.6 0019E8 53415645 DB 'SAVE' 1480.7 0019EC EVEN 1480.8 0019EC IF 'DOCOLON'='DOCODE' 1480.9 0019EC SAVE: DW $+2 1480.10 0019EC ELSE 1480.11 0019EC .... SAVE: DW DOCOLON 1480.12 0019EE ENDIF 1480.13 0019EE ENDM 1481 0019EE ........4100* DW INFOB,lit,63+2,FLERASE 1482 0019F6 ............* DW U0,APPU0,NINIT,DTOI 1483 0019FE ............* DW APPCRC,lit,crcval,ISTORE 1484 001A06 .... DW EXIT 1485 001A08 1486 00018E CORREST EQU 018Eh 1487 000186 CORPOWERON EQU 0186h 1488 001A08 1489 001A08 ;Z BOOT -- boot system 1490 001A08 HEADER BOOT,4,'BOOT',DOCOLON 1490.1 000000 PUBLIC BOOT 1490.2 001A08 .... DW link 1490.3 001A0A FF DB 0FFh ; not immediate 1490.4 001A0B link SET $ 1490.5 001A0B 04 DB 4 1490.6 001A0C 424F4F54 DB 'BOOT' 1490.7 001A10 EVEN 1490.8 001A10 IF 'DOCOLON'='DOCODE' 1490.9 001A10 BOOT: DW $+2 1490.10 001A10 ELSE 1490.11 001A10 .... BOOT: DW DOCOLON 1490.12 001A12 ENDIF 1490.13 001A12 ENDM 1491 001A12 .... DW DOTVER 1492 001A14 ............ DW S2,cget,qbran 1493 001A1A DEST boot1 1493.1 001A1A 2A00 DW boot1-$ 1493.2 001A1C ENDM 1494 001A1C ........ DW VALIDQ,qbran 1495 001A20 DEST invalid 1495.1 001A20 0400 DW invalid-$ 1495.2 001A22 ENDM 1496 001A22 .... valid: DW COLD ; valid infoB and dictionary 1497 001A24 ............*invalid:DW COR,FETCH,lit,CORPOWERON,NOTEQUAL,qbr an 1498 001A30 DEST boot1 1498.1 001A30 1400 DW boot1-$ 1498.2 001A32 ENDM 1499 001A32 reset: ; reset and invalid infoB 1500 001A32 ............* DW LATEST,FETCH,lit,FLASHSTART,ITHERE,WI THIN,qbran ; check RAM latest 1501 001A40 DEST boot1 1501.1 001A40 0400 DW boot1-$ 1501.2 001A42 ENDM 1502 001A42 .... DW WARM ; invalid infoB but seemingly valid RAM 1503 001A44 .... boot1: DW WIPE ; invalid infoB but power on or RAM invalid 1504 001A46 1505 000000 PUBLIC BOOTIP ; used to init IP register. 1506 001A46 BOOTIP equ BOOT+2 1507 001A46 1508 001A46 ;Z WARM -- use user area from RAM (hopefully intact) 1509 001A46 HEADER WARM,4,'WARM',DOCOLON 1509.1 000000 PUBLIC WARM 1509.2 001A46 .... DW link 1509.3 001A48 FF DB 0FFh ; not immediate 1509.4 001A49 link SET $ 1509.5 001A49 04 DB 4 1509.6 001A4A 5741524D DB 'WARM' 1509.7 001A4E EVEN 1509.8 001A4E IF 'DOCOLON'='DOCODE' 1509.9 001A4E WARM: DW $+2 1509.10 001A4E ELSE 1509.11 001A4E .... WARM: DW DOCOLON 1509.12 001A50 ENDIF 1509.13 001A50 ENDM 1510 001A50 .... DW XISQUOTE 1511 001A52 05 DB (warm1-warm0) 1512 001A53 5761726D warm0: DB 'Warm' 1513 001A57 00 EVEN 1514 001A58 .... warm1: DW ITYPE 1515 001A5A .... DW ABORT 1516 001A5C 1517 001A5C ;U .COLD -- display COLD message 1518 001A5C HEADLESS DOTCOLD,DOCOLON 1518.1 000000 PUBLIC DOTCOLD 1518.2 001A5C IF 'DOCOLON'='DOCODE' 1518.3 001A5C DOTCOLD: DW $+2 1518.4 001A5C ELSE 1518.5 001A5C .... DOTCOLD: DW DOCOLON 1518.6 001A5E ENDIF 1518.7 001A5E ENDM 1519 001A5E .... DW XISQUOTE 1520 001A60 05 DB (dotcold1-dotcold0) 1521 001A61 436F6C64 dotcold0:DB 'Cold' 1522 001A65 00 EVEN 1523 001A66 .... dotcold1:DW ITYPE 1524 001A68 .... DW EXIT 1525 001A6A 1526 001A6A PUBLIC DOTCOLD 1527 001A6A 1528 001A6A ;Z COLD -- set user area to latest application 1529 001A6A HEADER COLD,4,'COLD',DOCOLON 1529.1 000000 PUBLIC COLD 1529.2 001A6A .... DW link 1529.3 001A6C FF DB 0FFh ; not immediate 1529.4 001A6D link SET $ 1529.5 001A6D 04 DB 4 1529.6 001A6E 434F4C44 DB 'COLD' 1529.7 001A72 EVEN 1529.8 001A72 IF 'DOCOLON'='DOCODE' 1529.9 001A72 COLD: DW $+2 1529.10 001A72 ELSE 1529.11 001A72 .... COLD: DW DOCOLON 1529.12 001A74 ENDIF 1529.13 001A74 ENDM 1530 001A74 ............* DW APPU0,U0,NINIT,ITOD ; use application user area 1531 001A7C ............ DW APP,FETCH,EXECUTE ; AUTOSTART Application 1532 001A82 .... DW ABORT 1533 001A84 1534 001A84 ;Z FACTORY -- set user area to delivery condition 1535 001A84 ; UINIT U0 #INIT I->D SAVE init user area 1536 001A84 ; ABORT ; 1537 001A84 HEADER FACTORY,7,'FACTORY',DOCOLON 1537.1 000000 PUBLIC FACTORY 1537.2 001A84 .... DW link 1537.3 001A86 FF DB 0FFh ; not immediate 1537.4 001A87 link SET $ 1537.5 001A87 07 DB 7 1537.6 001A88 464143544F52* DB 'FACTORY' 1537.7 001A8F 00 EVEN 1537.8 001A90 IF 'DOCOLON'='DOCODE' 1537.9 001A90 FACTORY: DW $+2 1537.10 001A90 ELSE 1537.11 001A90 .... FACTORY: DW DOCOLON 1537.12 001A92 ENDIF 1537.13 001A92 ENDM 1538 001A92 ............* DW UINIT,U0,NINIT,ITOD ; use kernel user area 1539 001A9A .... DW SAVE 1540 001A9C .... DW ABORT ; ABORT never returns 1541 001A9E 1542 000000 PUBLIC FACTORYIP ; used to init IP register. 1543 001A9E FACTORYIP equ FACTORY+2 1544 001A9E 1545 001A9E ;U WIPE -- erase flash but not kernel, reset user area. 1546 001A9E HEADER WIPE,4,'WIPE',DOCOLON 1546.1 000000 PUBLIC WIPE 1546.2 001A9E .... DW link 1546.3 001AA0 FF DB 0FFh ; not immediate 1546.4 001AA1 link SET $ 1546.5 001AA1 04 DB 4 1546.6 001AA2 57495045 DB 'WIPE' 1546.7 001AA6 EVEN 1546.8 001AA6 IF 'DOCOLON'='DOCODE' 1546.9 001AA6 WIPE: DW $+2 1546.10 001AA6 ELSE 1546.11 001AA6 .... WIPE: DW DOCOLON 1546.12 001AA8 ENDIF 1546.13 001AA8 ENDM 1547 001AA8 .... DW XISQUOTE 1548 001AAA 07 DB (wipmsg1-wipmsg0) 1549 001AAB 576970696E67 wipmsg0:DB 'Wiping' 1550 001AB1 00 EVEN 1551 001AB2 .... wipmsg1:DW ITYPE 1552 001AB4 ....00C0....* DW lit,FLASHSTART,lit,FLASHEND-FLASHSTAR T+1,FLERASE 1553 001ABE .... DW FACTORY ; EXIT 1554 001AC0 1555 001AC0 ;U MISC ======================================== ================================ 1556 001AC0 1557 001AC0 ;C 2CONSTANT -- define a Forth double constant 1558 001AC0 ; (machine code fragment) 1560 001AC0 ; Note that the constant is stored in Code space. 1561 001AC0 HEADER TWOCONSTANT,9,'2CONSTANT',DOCOLON 1561.1 000000 PUBLIC TWOCONSTANT 1561.2 001AC0 .... DW link 1561.3 001AC2 FF DB 0FFh ; not immediate 1561.4 001AC3 link SET $ 1561.5 001AC3 09 DB 9 1561.6 001AC4 32434F4E5354* DB '2CONSTANT' 1561.7 001ACD 00 EVEN 1561.8 001ACE IF 'DOCOLON'='DOCODE' 1561.9 001ACE TWOCONSTANT: DW $+2 1561.10 001ACE ELSE 1561.11 001ACE .... TWOCONSTANT: DW DOCOLON 1561.12 001AD0 ENDIF 1561.13 001AD0 ENDM 1562 001AD0 ............* DW BUILDS,ICOMMA,ICOMMA,XDOES 1563 000000 PUBLIC DOTWOCON 1564 001AD8 DOTWOCON: ; ( -- w1 w2 ) 1565 001AD8 2482 SUB #4,PSP ; make room on stack 1566 001ADA 84470200 MOV TOS,2(PSP) 1567 001ADE 3746 MOV @W+,TOS ; fetch from parameter field to TOS 1568 001AE0 A4460000 MOV @W,0(PSP) ; fetch secon word from parameter field to NOS 1569 001AE4 NEXT 1569.1 001AE4 3645 MOV @IP+,W // ; fetch word address into W 1569.2 001AE6 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 1569.3 001AE8 ENDM 1570 001AE8 1571 001AE8 ;U \ -- backslash 1572 001AE8 ; everything up to the end of the current line is a comment. 1573 001AE8 ; SOURCE >IN ! DROP ; 1574 001AE8 IMMED BACKSLASH,1,'\\',DOCOLON 1574.1 000000 PUBLIC BACKSLASH 1574.2 001AE8 .... DW link 1574.3 001AEA FE DB 0FEh // ; immediate (LSB=0) 1574.4 001AEB link SET $ 1574.5 001AEB 01 DB 1 1574.6 001AEC 5C DB '\\' 1574.7 001AED 00 EVEN 1574.8 001AEE IF 'DOCOLON'='DOCODE' 1574.9 001AEE BACKSLASH: DW $+2 1574.10 001AEE ELSE 1574.11 001AEE .... BACKSLASH: DW DOCOLON 1574.12 001AF0 ENDIF 1574.13 001AF0 ENDM 1575 001AF0 ............* DW SOURCE,TOIN,STORE,DROP,EXIT 1576 001AFA 1577 001AFA ;Z .VER -- type message 1578 001AFA HEADER DOTVER,4,'.VER',DOCOLON 1578.1 000000 PUBLIC DOTVER 1578.2 001AFA .... DW link 1578.3 001AFC FF DB 0FFh ; not immediate 1578.4 001AFD link SET $ 1578.5 001AFD 04 DB 4 1578.6 001AFE 2E564552 DB '.VER' 1578.7 001B02 EVEN 1578.8 001B02 IF 'DOCOLON'='DOCODE' 1578.9 001B02 DOTVER: DW $+2 1578.10 001B02 ELSE 1578.11 001B02 .... DOTVER: DW DOCOLON 1578.12 001B04 ENDIF 1578.13 001B04 ENDM 1579 001B04 ............* DW lit,version,COUNT,ITYPE 1580 001B0C ............ DW BASE,FETCH,BIN 1581 001B12 ............ DW COR,FETCH,DOT 1582 001B18 ........ DW BASE,STORE 1583 001B1C .... DW EXIT ; print cause of reset 1584 001B1E 1585 001B1E ;U BELL -- send $07 to Terminal 1586 001B1E HEADER BELL,4,'BELL',DOCOLON 1586.1 000000 PUBLIC BELL 1586.2 001B1E .... DW link 1586.3 001B20 FF DB 0FFh ; not immediate 1586.4 001B21 link SET $ 1586.5 001B21 04 DB 4 1586.6 001B22 42454C4C DB 'BELL' 1586.7 001B26 EVEN 1586.8 001B26 IF 'DOCOLON'='DOCODE' 1586.9 001B26 BELL: DW $+2 1586.10 001B26 ELSE 1586.11 001B26 .... BELL: DW DOCOLON 1586.12 001B28 ENDIF 1586.13 001B28 ENDM 1587 001B28 ....0700....* DW lit,7,EMIT,EXIT 1588 001B30 1589 001B30 ;U ESC[ -- start esc-sequence 1590 001B30 ; 27 emit 91 emit ; 1591 001B30 HEADERLESS ESCPAR,4,'ESC[',DOCOLON 1591.1 000000 PUBLIC ESCPAR 1591.2 001B30 IF 'DOCOLON'='DOCODE' 1591.3 001B30 ESCPAR: DW $+2 1591.4 001B30 ELSE 1591.5 001B30 .... ESCPAR: DW DOCOLON 1591.6 001B32 ENDIF 1591.7 001B32 ENDM 1592 001B32 ....1B00....* DW lit,27,EMIT, lit,91,EMIT 1593 001B3E .... DW EXIT 1594 001B40 1595 001B40 ;U PN -- send parameter of esc-sequence 1596 001B40 ; base @ swap decimal 0 u.r base ! ; 1597 001B40 HEADERLESS PN,2,'PN',DOCOLON 1597.1 000000 PUBLIC PN 1597.2 001B40 IF 'DOCOLON'='DOCODE' 1597.3 001B40 PN: DW $+2 1597.4 001B40 ELSE 1597.5 001B40 .... PN: DW DOCOLON 1597.6 001B42 ENDIF 1597.7 001B42 ENDM 1598 001B42 ........ DW BASE,FETCH 1599 001B46 ............* DW SWAP,DECIMAL,ZERO,UDOTR 1600 001B4E ........ DW BASE,STORE 1601 001B52 .... DW EXIT 1602 001B54 1603 001B54 ;U ;PN -- send delimiter ; followed by parameter 1604 001B54 ; 59 emit pn ; 1605 001B54 HEADERLESS SEMIPN,3,';PN',DOCOLON 1605.1 000000 PUBLIC SEMIPN 1605.2 001B54 IF 'DOCOLON'='DOCODE' 1605.3 001B54 SEMIPN: DW $+2 1605.4 001B54 ELSE 1605.5 001B54 .... SEMIPN: DW DOCOLON 1605.6 001B56 ENDIF 1605.7 001B56 ENDM 1606 001B56 ....3B00....* DW lit,59,EMIT,PN 1607 001B5E .... DW EXIT 1608 001B60 1609 001B60 ;U AT-XY x y -- send esc-sequence to terminal 1610 001B60 ; 1+ swap 1+ swap ESC[ pn ;pn 72 emit ; 1611 001B60 HEADER ATXY,5,'AT-XY',DOCOLON 1611.1 000000 PUBLIC ATXY 1611.2 001B60 .... DW link 1611.3 001B62 FF DB 0FFh ; not immediate 1611.4 001B63 link SET $ 1611.5 001B63 05 DB 5 1611.6 001B64 41542D5859 DB 'AT-XY' 1611.7 001B69 00 EVEN 1611.8 001B6A IF 'DOCOLON'='DOCODE' 1611.9 001B6A ATXY: DW $+2 1611.10 001B6A ELSE 1611.11 001B6A .... ATXY: DW DOCOLON 1611.12 001B6C ENDIF 1611.13 001B6C ENDM 1612 001B6C ............* DW ONEPLUS,SWAP,ONEPLUS,SWAP 1613 001B74 ........ DW ESCPAR,PN 1614 001B78 ........4800* DW SEMIPN, lit,72,EMIT 1615 001B80 .... DW EXIT 1616 001B82 1617 001B82 ;U PAGE -- send "page" command to terminal to clear screen. 1618 001B82 ; esc[ ." 2J" 0 0 at-xy ; 1619 001B82 HEADER PAGEE,4,'PAGE',DOCOLON 1619.1 000000 PUBLIC PAGEE 1619.2 001B82 .... DW link 1619.3 001B84 FF DB 0FFh ; not immediate 1619.4 001B85 link SET $ 1619.5 001B85 04 DB 4 1619.6 001B86 50414745 DB 'PAGE' 1619.7 001B8A EVEN 1619.8 001B8A IF 'DOCOLON'='DOCODE' 1619.9 001B8A PAGEE: DW $+2 1619.10 001B8A ELSE 1619.11 001B8A .... PAGEE: DW DOCOLON 1619.12 001B8C ENDIF 1619.13 001B8C ENDM 1620 001B8C .... DW ESCPAR 1621 001B8E .... DW XISQUOTE 1622 001B90 03 DB (ESC1-ESC0) 1623 001B91 324A ESC0: DB '2J' 1624 001B93 00 EVEN 1625 001B94 .... ESC1: DW ITYPE 1626 001B96 ............ DW ZERO,ZERO,ATXY 1627 001B9C .... DW EXIT 1628 001B9E 1629 001B9E ;U BIN -- set number base to binary 1630 001B9E HEADER BIN,3,'BIN',DOCOLON 1630.1 000000 PUBLIC BIN 1630.2 001B9E .... DW link 1630.3 001BA0 FF DB 0FFh ; not immediate 1630.4 001BA1 link SET $ 1630.5 001BA1 03 DB 3 1630.6 001BA2 42494E DB 'BIN' 1630.7 001BA5 00 EVEN 1630.8 001BA6 IF 'DOCOLON'='DOCODE' 1630.9 001BA6 BIN: DW $+2 1630.10 001BA6 ELSE 1630.11 001BA6 .... BIN: DW DOCOLON 1630.12 001BA8 ENDIF 1630.13 001BA8 ENDM 1631 001BA8 ....0200....* DW lit,2,BASE,STORE,EXIT 1632 001BB2 1633 001BB2 1634 001BB2 1635 001BB2 ;U MCU specific words ========================== ================================ 1636 001BB2 1637 001BB2 ;U 1MS -- wait about 1 millisecond 1638 001BB2 ; xx 0 DO yy 0 DO LOOP LOOP ; adjust xx and yy to get a msec. 1639 001BB2 HEADER ONEMS,3,'1MS',DOCOLON 1639.1 000000 PUBLIC ONEMS 1639.2 001BB2 .... DW link 1639.3 001BB4 FF DB 0FFh ; not immediate 1639.4 001BB5 link SET $ 1639.5 001BB5 03 DB 3 1639.6 001BB6 314D53 DB '1MS' 1639.7 001BB9 00 EVEN 1639.8 001BBA IF 'DOCOLON'='DOCODE' 1639.9 001BBA ONEMS: DW $+2 1639.10 001BBA ELSE 1639.11 001BBA .... ONEMS: DW DOCOLON 1639.12 001BBC ENDIF 1639.13 001BBC ENDM 1640 001BBC ....2900....* DW lit,41,ZERO,xdo 1641 001BC4 ....0B00....*onems1: DW lit,11,ZERO,xdo 1642 001BCC .... onems2: DW xloop 1643 001BCE DEST onems2 1643.1 001BCE FEFF DW onems2-$ 1643.2 001BD0 ENDM 1644 001BD0 .... DW xloop 1645 001BD2 DEST onems1 1645.1 001BD2 F2FF DW onems1-$ 1645.2 001BD4 ENDM 1646 001BD4 .... DW EXIT 1647 001BD6 1648 001BD6 ;U MS n -- wait about n milliseconds 1649 001BD6 ; 0 DO 1MS LOOP ; 1650 001BD6 HEADER MS,2,'MS',DOCOLON 1650.1 000000 PUBLIC MS 1650.2 001BD6 .... DW link 1650.3 001BD8 FF DB 0FFh ; not immediate 1650.4 001BD9 link SET $ 1650.5 001BD9 02 DB 2 1650.6 001BDA 4D53 DB 'MS' 1650.7 001BDC EVEN 1650.8 001BDC IF 'DOCOLON'='DOCODE' 1650.9 001BDC MS: DW $+2 1650.10 001BDC ELSE 1650.11 001BDC .... MS: DW DOCOLON 1650.12 001BDE ENDIF 1650.13 001BDE ENDM 1651 001BDE ........ DW ZERO,xdo 1652 001BE2 ........ ms1: DW ONEMS,xloop 1653 001BE6 DEST ms1 1653.1 001BE6 FCFF DW ms1-$ 1653.2 001BE8 ENDM 1654 001BE8 .... DW EXIT 1655 001BEA 1656 001BEA 1657 001BEA 1658 001BEA ;U Bit manipulation words ---------------------- -------------------------------- 1659 001BEA ; based on http://www.forth.org/svfig/Len/bits. htm 1660 001BEA 1661 001BEA ;U SET mask addr -- set bit from mask in addr (cell); use even adr! 1662 001BEA HEADER wset,3,'SET',DOCODE 1662.1 000000 PUBLIC wset 1662.2 001BEA .... DW link 1662.3 001BEC FF DB 0FFh ; not immediate 1662.4 001BED link SET $ 1662.5 001BED 03 DB 3 1662.6 001BEE 534554 DB 'SET' 1662.7 001BF1 00 EVEN 1662.8 001BF2 IF 'DOCODE'='DOCODE' 1662.9 001BF2 .... wset: DW $+2 1662.10 001BF4 ELSE 1662.11 001BF4 wset: DW DOCODE 1662.12 001BF4 ENDIF 1662.13 001BF4 ENDM 1663 001BF4 A7D40000 BIS @PSP,0(TOS) 1664 001BF8 2453 ADD #2,PSP 1665 001BFA 3744 MOV @PSP+,TOS 1666 001BFC NEXT 1666.1 001BFC 3645 MOV @IP+,W // ; fetch word address into W 1666.2 001BFE 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 1666.3 001C00 ENDM 1667 001C00 1668 001C00 ;U CSET mask addr -- set bit from mask in addr (byte) 1669 001C00 HEADER cset,4,'CSET',DOCODE 1669.1 000000 PUBLIC cset 1669.2 001C00 .... DW link 1669.3 001C02 FF DB 0FFh ; not immediate 1669.4 001C03 link SET $ 1669.5 001C03 04 DB 4 1669.6 001C04 43534554 DB 'CSET' 1669.7 001C08 EVEN 1669.8 001C08 IF 'DOCODE'='DOCODE' 1669.9 001C08 .... cset: DW $+2 1669.10 001C0A ELSE 1669.11 001C0A cset: DW DOCODE 1669.12 001C0A ENDIF 1669.13 001C0A ENDM 1670 001C0A E7D40000 BIS.B @PSP,0(TOS) 1671 001C0E 2453 ADD #2,PSP 1672 001C10 3744 MOV @PSP+,TOS 1673 001C12 NEXT 1673.1 001C12 3645 MOV @IP+,W // ; fetch word address into W 1673.2 001C14 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 1673.3 001C16 ENDM 1674 001C16 1675 001C16 ;U CLR mask addr -- reset bit from mask in addr (cell); use even adr! 1676 001C16 HEADER wclr,3,'CLR',DOCODE 1676.1 000000 PUBLIC wclr 1676.2 001C16 .... DW link 1676.3 001C18 FF DB 0FFh ; not immediate 1676.4 001C19 link SET $ 1676.5 001C19 03 DB 3 1676.6 001C1A 434C52 DB 'CLR' 1676.7 001C1D 00 EVEN 1676.8 001C1E IF 'DOCODE'='DOCODE' 1676.9 001C1E .... wclr: DW $+2 1676.10 001C20 ELSE 1676.11 001C20 wclr: DW DOCODE 1676.12 001C20 ENDIF 1676.13 001C20 ENDM 1677 001C20 A7C40000 BIC @PSP,0(TOS) 1678 001C24 2453 ADD #2,PSP 1679 001C26 3744 MOV @PSP+,TOS 1680 001C28 NEXT 1680.1 001C28 3645 MOV @IP+,W // ; fetch word address into W 1680.2 001C2A 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 1680.3 001C2C ENDM 1681 001C2C 1682 001C2C ;U CCLR mask addr -- reset bit from mask in addr (byte) 1683 001C2C HEADER cclr,4,'CCLR',DOCODE 1683.1 000000 PUBLIC cclr 1683.2 001C2C .... DW link 1683.3 001C2E FF DB 0FFh ; not immediate 1683.4 001C2F link SET $ 1683.5 001C2F 04 DB 4 1683.6 001C30 43434C52 DB 'CCLR' 1683.7 001C34 EVEN 1683.8 001C34 IF 'DOCODE'='DOCODE' 1683.9 001C34 .... cclr: DW $+2 1683.10 001C36 ELSE 1683.11 001C36 cclr: DW DOCODE 1683.12 001C36 ENDIF 1683.13 001C36 ENDM 1684 001C36 E7C40000 BIC.B @PSP,0(TOS) 1685 001C3A 2453 ADD #2,PSP 1686 001C3C 3744 MOV @PSP+,TOS 1687 001C3E NEXT 1687.1 001C3E 3645 MOV @IP+,W // ; fetch word address into W 1687.2 001C40 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 1687.3 001C42 ENDM 1688 001C42 1689 001C42 ;U CTOGGLE mask addr -- flip bit from mask in addr (byte) 1690 001C42 HEADER ctoggle,7,'CTOGGLE',DOCODE 1690.1 000000 PUBLIC ctoggle 1690.2 001C42 .... DW link 1690.3 001C44 FF DB 0FFh ; not immediate 1690.4 001C45 link SET $ 1690.5 001C45 07 DB 7 1690.6 001C46 43544F47474C* DB 'CTOGGLE' 1690.7 001C4D 00 EVEN 1690.8 001C4E IF 'DOCODE'='DOCODE' 1690.9 001C4E .... ctoggle: DW $+2 1690.10 001C50 ELSE 1690.11 001C50 ctoggle: DW DOCODE 1690.12 001C50 ENDIF 1690.13 001C50 ENDM 1691 001C50 E7E40000 XOR.B @PSP,0(TOS) 1692 001C54 2453 ADD #2,PSP 1693 001C56 3744 MOV @PSP+,TOS 1694 001C58 NEXT 1694.1 001C58 3645 MOV @IP+,W // ; fetch word address into W 1694.2 001C5A 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 1694.3 001C5C ENDM 1695 001C5C 1696 001C5C ;U CGET mask addr -- flag test bit from mask in addr (byte) 1697 001C5C HEADER cget,4,'CGET',DOCODE 1697.1 000000 PUBLIC cget 1697.2 001C5C .... DW link 1697.3 001C5E FF DB 0FFh ; not immediate 1697.4 001C5F link SET $ 1697.5 001C5F 04 DB 4 1697.6 001C60 43474554 DB 'CGET' 1697.7 001C64 EVEN 1697.8 001C64 IF 'DOCODE'='DOCODE' 1697.9 001C64 .... cget: DW $+2 1697.10 001C66 ELSE 1697.11 001C66 cget: DW DOCODE 1697.12 001C66 ENDIF 1697.13 001C66 ENDM 1698 001C66 E7B40000 BIT.B @PSP,0(TOS) 1699 001C6A 0224 JZ cget1 1700 001C6C 3743 MOV #-1,TOS 1701 001C6E 013C JMP cget2 1702 001C70 0743 cget1:MOV #0, TOS 1703 001C72 2453 cget2:ADD #2,PSP 1704 001C74 NEXT 1704.1 001C74 3645 MOV @IP+,W // ; fetch word address into W 1704.2 001C76 3046 MOV @W+,PC // ; fetch code address into PC, W=PFA 1704.3 001C78 ENDM 1705 001C78 1706 001C78 1707 001C78 ;U Memory info --------------------------------- -------------------------------- 1708 001C78 1709 001C78 ;Z MEMBOT -- adr begining of flash 1710 001C78 HEADER MEMBOT,6,'MEMBOT',DOCON 1710.1 000000 PUBLIC MEMBOT 1710.2 001C78 .... DW link 1710.3 001C7A FF DB 0FFh ; not immediate 1710.4 001C7B link SET $ 1710.5 001C7B 06 DB 6 1710.6 001C7C 4D454D424F54 DB 'MEMBOT' 1710.7 001C82 EVEN 1710.8 001C82 IF 'DOCON'='DOCODE' 1710.9 001C82 MEMBOT: DW $+2 1710.10 001C82 ELSE 1710.11 001C82 .... MEMBOT: DW DOCON 1710.12 001C84 ENDIF 1710.13 001C84 ENDM 1711 001C84 00C0 DW FLASHSTART 1712 001C86 1713 001C86 ;Z MEMTOP -- adr end of flash 1714 001C86 HEADER MEMTOP,6,'MEMTOP',DOCON 1714.1 000000 PUBLIC MEMTOP 1714.2 001C86 .... DW link 1714.3 001C88 FF DB 0FFh ; not immediate 1714.4 001C89 link SET $ 1714.5 001C89 06 DB 6 1714.6 001C8A 4D454D544F50 DB 'MEMTOP' 1714.7 001C90 EVEN 1714.8 001C90 IF 'DOCON'='DOCODE' 1714.9 001C90 MEMTOP: DW $+2 1714.10 001C90 ELSE 1714.11 001C90 .... MEMTOP: DW DOCON 1714.12 001C92 ENDIF 1714.13 001C92 ENDM 1715 001C92 FFDF DW FLASHEND 1716 001C94 1717 001C94 ;U MEM -- u bytes left in flash 1718 001C94 HEADER MEM,3,'MEM',DOCOLON 1718.1 000000 PUBLIC MEM 1718.2 001C94 .... DW link 1718.3 001C96 FF DB 0FFh ; not immediate 1718.4 001C97 link SET $ 1718.5 001C97 03 DB 3 1718.6 001C98 4D454D DB 'MEM' 1718.7 001C9B 00 EVEN 1718.8 001C9C IF 'DOCOLON'='DOCODE' 1718.9 001C9C MEM: DW $+2 1718.10 001C9C ELSE 1718.11 001C9C .... MEM: DW DOCOLON 1718.12 001C9E ENDIF 1718.13 001C9E ENDM 1719 001C9E ....FFDF....* DW lit,FLASHEND,IHERE,MINUS 1720 001CA6 .... DW EXIT 1721 001CA8 1722 001CA8 ;U UNUSED -- u bytes left in RAM 1723 001CA8 HEADER UNUSED,6,'UNUSED',DOCOLON 1723.1 000000 PUBLIC UNUSED 1723.2 001CA8 .... DW link 1723.3 001CAA FF DB 0FFh ; not immediate 1723.4 001CAB link SET $ 1723.5 001CAB 06 DB 6 1723.6 001CAC 554E55534544 DB 'UNUSED' 1723.7 001CB2 EVEN 1723.8 001CB2 IF 'DOCOLON'='DOCODE' 1723.9 001CB2 UNUSED: DW $+2 1723.10 001CB2 ELSE 1723.11 001CB2 .... UNUSED: DW DOCOLON 1723.12 001CB4 ENDIF 1723.13 001CB4 ENDM 1724 001CB4 ....FF03....* DW lit,RAMEND,HERE,MINUS 1725 001CBC .... DW EXIT 1726 001CBE 1727 001CBE ;U MCU Peripherie ------------------------------ -------------------------------- 1728 001CBE 1729 001CBE ;Z P1 -- adr address of port1 output register 1730 001CBE HEADER P1,2,'P1',DOCON 1730.1 000000 PUBLIC P1 1730.2 001CBE .... DW link 1730.3 001CC0 FF DB 0FFh ; not immediate 1730.4 001CC1 link SET $ 1730.5 001CC1 02 DB 2 1730.6 001CC2 5031 DB 'P1' 1730.7 001CC4 EVEN 1730.8 001CC4 IF 'DOCON'='DOCODE' 1730.9 001CC4 P1: DW $+2 1730.10 001CC4 ELSE 1730.11 001CC4 .... P1: DW DOCON 1730.12 001CC6 ENDIF 1730.13 001CC6 ENDM 1731 001CC6 2100 DW P1OUT 1732 001CC8 1733 001CC8 ;Z P2 -- adr address of port2 output register 1734 001CC8 HEADER P2,2,'P2',DOCON 1734.1 000000 PUBLIC P2 1734.2 001CC8 .... DW link 1734.3 001CCA FF DB 0FFh ; not immediate 1734.4 001CCB link SET $ 1734.5 001CCB 02 DB 2 1734.6 001CCC 5032 DB 'P2' 1734.7 001CCE EVEN 1734.8 001CCE IF 'DOCON'='DOCODE' 1734.9 001CCE P2: DW $+2 1734.10 001CCE ELSE 1734.11 001CCE .... P2: DW DOCON 1734.12 001CD0 ENDIF 1734.13 001CD0 ENDM 1735 001CD0 2900 DW P2OUT 1736 001CD2 1737 001CD2 ;Z P3 -- adr address of port2 output register 1738 001CD2 HEADER P3,2,'P3',DOCON 1738.1 000000 PUBLIC P3 1738.2 001CD2 .... DW link 1738.3 001CD4 FF DB 0FFh ; not immediate 1738.4 001CD5 link SET $ 1738.5 001CD5 02 DB 2 1738.6 001CD6 5033 DB 'P3' 1738.7 001CD8 EVEN 1738.8 001CD8 IF 'DOCON'='DOCODE' 1738.9 001CD8 P3: DW $+2 1738.10 001CD8 ELSE 1738.11 001CD8 .... P3: DW DOCON 1738.12 001CDA ENDIF 1738.13 001CDA ENDM 1739 001CDA 1900 DW P3OUT 1740 001CDC 1741 001CDC ; Note: the first character sent from the MSP430 seems to get 1742 001CDC ; scrambled. I conjecture this is because the baud rate generator 1743 001CDC ; has not reset to the new rate when we attempt to send a character. 1744 001CDC ; See init430f1611.s43 for delay after initialization. 905 001CDC #include "4e-LaunchPad.s43" 1 001CDC ; ---------------------------------------------- ------------------------ 2 001CDC ; 4e4th is a Forth based on CamelForth 3 001CDC ; for the Texas Instruments MSP430 4 001CDC ; 5 001CDC ; This program is free software; you can redistribute it and/or modify 6 001CDC ; it under the terms of the GNU General Public License as published by 7 001CDC ; the Free Software Foundation; either version 3 of the License, or 8 001CDC ; (at your option) any later version. 9 001CDC ; 10 001CDC ; This program is distributed in the hope that it will be useful, 11 001CDC ; but WITHOUT ANY WARRANTY; without even the implied warranty of 12 001CDC ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 001CDC ; GNU General Public License for more details. 14 001CDC ; 15 001CDC ; You should have received a copy of the GNU General Public License 16 001CDC ; along with this program. If not, see . 17 001CDC ; 18 001CDC ; See LICENSE TERMS in Brads file readme.txt as well. 19 001CDC 20 001CDC ; ---------------------------------------------- ------------------------ 21 001CDC ; 4e-LaunchPad.s43 - LaunchPad Suporting Words - MSP430G2553 22 001CDC ; ---------------------------------------------- ------------------------ 23 001CDC 24 001CDC 25 001CDC ;U PORTS --------------------------------------- ------------------------ 26 001CDC 27 001CDC ; TI document SLAU144I - December 2004 - Revised January 2012 28 001CDC ; The digital I/O registers are listed in Table 8-2. 29 001CDC 30 001CDC ;U \ P1in = $20 31 001CDC ;U \ P1out = $21 32 001CDC ;U \ P1dir = $22 33 001CDC 34 001CDC ;U \ P2in = $28 35 001CDC ;U \ P2out = $29 36 001CDC ;U \ P2dir = $2A 37 001CDC 38 001CDC ;U \ LED - portpinX->---resistor---LED---GND 39 001CDC ;U \ P1.0 - red LED 40 001CDC ;U \ P1.6 - green LED 41 001CDC 42 001CDC ;U RED -- mask port red LED mask and port address 43 001CDC HEADER red,3,'RED',DOTWOCON 43.1 000000 PUBLIC red 43.2 001CDC .... DW link 43.3 001CDE FF DB 0FFh ; not immediate 43.4 001CDF link SET $ 43.5 001CDF 03 DB 3 43.6 001CE0 524544 DB 'RED' 43.7 001CE3 00 EVEN 43.8 001CE4 IF 'DOTWOCON'='DOCODE' 43.9 001CE4 red: DW $+2 43.10 001CE4 ELSE 43.11 001CE4 .... red: DW DOTWOCON 43.12 001CE6 ENDIF 43.13 001CE6 ENDM 44 001CE6 2100 DW P1OUT 45 001CE8 0100 DW 00000001b 46 001CEA 47 001CEA ;U GREEN -- mask port green LED mask and port address 48 001CEA HEADER green,5,'GREEN',DOTWOCON 48.1 000000 PUBLIC green 48.2 001CEA .... DW link 48.3 001CEC FF DB 0FFh ; not immediate 48.4 001CED link SET $ 48.5 001CED 05 DB 5 48.6 001CEE 475245454E DB 'GREEN' 48.7 001CF3 00 EVEN 48.8 001CF4 IF 'DOTWOCON'='DOCODE' 48.9 001CF4 green: DW $+2 48.10 001CF4 ELSE 48.11 001CF4 .... green: DW DOTWOCON 48.12 001CF6 ENDIF 48.13 001CF6 ENDM 49 001CF6 2100 DW P1OUT 50 001CF8 4000 DW 01000000b 51 001CFA 52 001CFA ;U \ Switch S2 53 001CFA ;U portpin P1.3 --->0_0----GND 54 001CFA ;U S2 -- mask port second button mask and port address 55 001CFA HEADER S2,2,'S2',DOTWOCON 55.1 000000 PUBLIC S2 55.2 001CFA .... DW link 55.3 001CFC FF DB 0FFh ; not immediate 55.4 001CFD link SET $ 55.5 001CFD 02 DB 2 55.6 001CFE 5332 DB 'S2' 55.7 001D00 EVEN 55.8 001D00 IF 'DOTWOCON'='DOCODE' 55.9 001D00 S2: DW $+2 55.10 001D00 ELSE 55.11 001D00 .... S2: DW DOTWOCON 55.12 001D02 ENDIF 55.13 001D02 ENDM 56 001D02 2000 DW P1IN 57 001D04 0800 DW 00001000b 58 001D06 59 001D06 ;U S2? -- f test button S2, true is pressed 60 001D06 HEADER SQEST,3,'S2?',DOCOLON 60.1 000000 PUBLIC SQEST 60.2 001D06 .... DW link 60.3 001D08 FF DB 0FFh ; not immediate 60.4 001D09 link SET $ 60.5 001D09 03 DB 3 60.6 001D0A 53323F DB 'S2?' 60.7 001D0D 00 EVEN 60.8 001D0E IF 'DOCOLON'='DOCODE' 60.9 001D0E SQEST: DW $+2 60.10 001D0E ELSE 60.11 001D0E .... SQEST: DW DOCOLON 60.12 001D10 ENDIF 60.13 001D10 ENDM 61 001D10 ............* DW S2, cget, ZEROEQUAL, EXIT 62 001D18 63 001D18 ; ---------------------------------------------- ------------------------ 906 001D18 907 001D18 908 001D18 /* 909 001D18 ; DEBUG FORTH EXECUTION 910 001D18 ; debug serieal 911 001D18 PUBLIC DEBUGIP 912 001D18 DEBUGIP: 913 001D18 ; DW DOTID 914 001D18 DEBUG1: 915 001D18 ; DW TASK 916 001D18 DW KEY ; 1@A0 test 1=rot,@=grün,A=beide,0=a us 917 001D18 DW DUP ;,DOTS,CR 918 001D18 DW STORELEDS 919 001D18 ; DW COLD 920 001D18 DW EMIT 921 001D18 DW lit,0,qbran 922 001D18 DW DEBUG1-$ 923 001D18 DW bran,-2 924 001D18 925 001D18 /* 926 001D18 ; debugging only 927 001D18 HEADLESS CREATE,DOCOLON 928 001D18 HEADLESS ALLOT,DOCOLON 929 001D18 HEADLESS BUILDS,DOCOLON 930 001D18 HEADLESS ICOMMA,DOCOLON 931 001D18 HEADLESS XDOES,DOCOLON 932 001D18 HEADLESS IHERE,DOCOLON 933 001D18 HEADLESS IALLOT,DOCOLON 934 001D18 HEADLESS CELL,DOCOLON 935 001D18 HEADLESS PJOUT,DOCOLON 936 001D18 */ 937 001D18 938 001D18 939 000000 PUBLIC lastword 940 001D18 lastword equ link 941 001D18 942 001D18 ; for debug map only: 943 001D18 CF430FRend: 944 001D18 #define CFlength = CF430FRend-CF430FRstart 945 001D18 946 001D18 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 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 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 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 CFlength #define, value: = CF430FRend-CF430FRstart, line: 944 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 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 322 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 FLASHEND #define, value: (0xDFFF), line: 32:3 309 331 351 382 1552:5 1715:5 1719:5 FLASHSTART #define, value: (0xC000), line: 31:3 307 329 349 380 156:5 1458:5 1466:5 1500:5 1552:5 1552:5 1711:5 FN0 #define, value: (0x0001u), line: 426:2 FN1 #define, value: (0x0002u), line: 427:2 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 321 322 324 325 364 365 368 369 395 396 399 400 428 429 447 448 FXKEY #define, value: (0x3300u), line: 418:2 GIE #define, value: (0x0008u), line: 82:2 HALLOT #define, value: IALLOT, line: 703:5 1064:5 HCCOMMA #define, value: ICCOMMA, line: 705:5 1062:5 HCFETCH #define, value: ICFETCH, line: 706:5 768:5 1064:5 HCOMMA #define, value: ICOMMA, line: 704:5 1061:5 HCOUNT #define, value: ICOUNT, line: 550:5 762:5 1365:5 HCSTORE #define, value: ICSTORE, line: 708:5 1133:5 HFETCH #define, value: IFETCH, line: 707:5 791:5 1123:5 1366:5 HHERE #define, value: IHERE, line: 702:5 1063:5 HSTORE #define, value: ISTORE, line: 709:5 HTYPE #define, value: ITYPE, line: 551:5 1365:5 HWORD #define, value: IWORDC, line: 552:5 1064:5 ICFETCH #define, value: CFETCH, line: 412 495:5 507:5 768:5 1064:5 ICOUNT #define, value: COUNT, line: 450:5 482:5 762:5 1365: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: 411 494:5 791:5 1123:5 1351:5 1352:5 1353:5 1366:5 1474:5 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: 46:3 635 638 639 648 652 660 665 673 687 INFOEND #define, value: (0x10FF), line: 28:3 314 356 387 INFOSEG #define, value: (128), line: 34:3 333 334 INFOSTART #define, value: (0x1000), line: 27:3 312 354 385 IP #define, value: R5, line: 41:3 62 63 67 68 77 78 79 107 117 129 157 158 159 160 177 183 188 195 203 211 216 222 229 236 243 249 256 262 274 280 285 292 337 372 453 461 467 474 481 486 491 496 501 507 512 517 522 527 532 543 555 564 571 579 591 614 614 615 622 623 641 651 654 664 667 675 683 689 718 749 765 782 799 822 837 857 875 886 1569:5 1666:5 1673:5 1680:5 1687:5 1694:5 1704:5 IRACL #define, value: R12, line: 59:3 700 708 716 729 734 748 IRACM #define, value: R13, line: 60:3 701 709 717 IRBT #define, value: W, line: 61:3 705 706 713 730 736 IROP1 #define, value: TOS, line: 56:3 706 731 733 741 IROP2L #define, value: R10, line: 57:3 697 708 710 724 738 IROP2M #define, value: R11, line: 58:3 704 709 711 723 731 733 739 741 747 ISSH #define, value: (0x0100u), line: 219:2 ITYPE #define, value: TYP, line: 449:5 529:5 977:5 1016:5 1365:5 1514:5 1523:5 1551:5 1579:5 1625:5 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: 47:3 634 636 637 639 653 666 674 688 LOCK #define, value: (0x0010u), line: 450:2 325 369 400 448 LOCKA #define, value: (0x0040u), line: 452:2 LPM0 #define, value: (CPUOFF), line: 91:2 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 MAINSEG #define, value: (512), line: 33:3 333 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 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 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 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: 957:5 963:5 972:5 PSP #define, value: R4, line: 40:3 54 60 61 104 105 114 115 125 126 154 155 175 176 187 192 193 199 200 201 207 208 209 210 215 221 226 227 233 234 240 241 242 247 248 253 254 261 278 279 289 291 301 336 343 371 376 422 423 452 460 465 466 471 472 473 478 485 490 495 536 547 575 587 599 620 637 640 661 671 672 679 680 697 716 723 724 747 756 757 764 773 774 781 787 788 798 811 812 820 826 827 835 842 843 874 882 883 890 891 1565:5 1566:5 1568:5 1663:5 1664:5 1665:5 1670:5 1671:5 1672:5 1677:5 1678:5 1679:5 1684:5 1685:5 1686:5 1691:5 1692:5 1693:5 1698:5 1703:5 Q #define, value: R12, line: 52:3 437 438 439 RAMEND #define, value: (0x03FF), line: 30:3 1724: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: 39:3 67 228 235 255 260 633 634 635 652 653 665 666 681 682 687 688 RSTIFG #define, value: (0x08), line: 139:2 SCCI #define, value: (0x0400u), line: 603:2 SCG0 #define, value: (0x0040u), line: 85:2 SCG1 #define, value: (0x0080u), line: 86:2 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: 53: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 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: 43:3 53 54 61 62 105 106 115 116 126 127 128 155 156 176 181 187 193 194 201 202 208 209 220 221 227 228 234 235 241 242 247 248 254 255 260 261 273 273 278 279 284 284 290 291 302 304 336 344 346 349 351 354 356 367 371 377 380 382 385 387 398 424 432 442 450 452 460 465 466 471 473 479 480 485 490 495 500 505 506 511 516 521 526 526 531 537 540 542 548 552 554 562 563 563 568 568 569 569 570 576 578 588 590 600 619 620 638 640 660 661 672 673 674 680 681 682 706 717 731 733 741 748 760 764 775 779 781 789 791 792 796 798 815 821 830 836 844 849 854 854 855 855 856 873 874 883 884 891 57:4 1566:5 1567:5 1663:5 1665:5 1670:5 1672:5 1677:5 1679:5 1684:5 1686:5 1691:5 1693:5 1698:5 1700:5 1702:5 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 UCA0RXIFG #define, value: (0x01), line: 153:2 880 892 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 871 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 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 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 USCIAB0TX_VECTOR #define, value: (6 * 2u), line: 966:2 V #define, value: (0x0100u), line: 81:2 W #define, value: R6, line: 42:3 53 55 63 63 68 68 78 79 79 106 107 107 116 117 117 127 129 129 137 137 138 156 158 160 160 177 177 183 183 188 188 192 194 195 195 199 202 203 203 207 210 211 211 216 216 222 222 229 229 236 236 243 243 249 249 256 256 262 262 274 274 280 280 285 285 289 290 292 292 301 302 304 307 309 312 314 323 329 331 333 334 337 337 343 346 367 372 372 376 377 398 422 434 440 441 444 445 453 453 461 461 467 467 474 474 478 479 480 481 481 486 486 491 491 496 496 501 501 507 507 512 512 517 517 522 522 527 527 532 532 536 539 539 542 543 543 547 551 554 555 555 564 564 571 571 575 576 579 579 587 588 591 591 599 600 615 615 623 623 641 641 654 654 667 667 675 675 683 683 689 689 705 706 713 718 718 730 736 749 749 757 760 761 765 765 773 777 778 782 782 787 791 794 795 799 799 812 815 817 820 822 822 827 830 832 835 837 837 842 846 857 857 875 875 886 886 1567:5 1568:5 1569:5 1569:5 1666:5 1666:5 1673:5 1673:5 1680:5 1680:5 1687:5 1687:5 1694:5 1694:5 1704:5 1704:5 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 365 396 429 X #define, value: R10, line: 50:3 423 436 437 444 756 758 762 774 777 788 792 793 795 811 813 818 821 826 828 833 836 843 846 848 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: 51:3 436 439 440 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 41 __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 __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 __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 AA6 ABORT REL CONST PUB UNTYP. CODE 1398 ABORTQUOTE REL CONST PUB UNTYP. CODE 13C4 ACC1 REL CONST UNTYP. CODE D24 ACC3 REL CONST UNTYP. CODE D5A ACC4 REL CONST UNTYP. CODE D64 ACC5 REL CONST UNTYP. CODE D68 ACCEPT REL CONST PUB UNTYP. CODE D1A ADC10AE0 ABS CONST UNTYP. ASEG 4A ADC10CTL0 ABS CONST UNTYP. ASEG 1B0 ADC10CTL1 ABS CONST UNTYP. ASEG 1B2 ADC10DTC0 ABS CONST UNTYP. ASEG 48 ADC10DTC1 ABS CONST UNTYP. ASEG 49 ADC10MEM ABS CONST UNTYP. ASEG 1B4 ADC10SA ABS CONST UNTYP. ASEG 1BC AGAIN REL CONST PUB UNTYP. CODE 1628 ALIGNED REL CONST PUB UNTYP. CODE 7F6 ALIGNN REL CONST PUB UNTYP. CODE 7DC ALLOT REL CONST PUB UNTYP. CODE F9A ANDD REL CONST PUB UNTYP. CODE 3EC APP REL CONST PUB UNTYP. CODE 9B4 APPCRC REL CONST PUB UNTYP. CODE 19B2 APPU0 REL CONST PUB UNTYP. CODE A72 ATXY REL CONST PUB UNTYP. CODE 1B6A AppU0 ABS CONST EXT [012] UNTYP. __EXTERNS Solved Extern BACKSLASH REL CONST PUB UNTYP. CODE 1AEE BASE REL CONST PUB UNTYP. CODE 944 BCSCTL1 ABS CONST UNTYP. ASEG 57 BCSCTL2 ABS CONST UNTYP. ASEG 58 BCSCTL3 ABS CONST UNTYP. ASEG 53 BEGIN REL CONST PUB UNTYP. CODE 1602 BELL REL CONST PUB UNTYP. CODE 1B26 BIN REL CONST PUB UNTYP. CODE 1BA6 BLANK REL CONST PUB UNTYP. CODE A10 BOOT REL CONST PUB UNTYP. CODE 1A10 BOOTIP REL CONST PUB UNTYP. CODE 1A12 BRACCHAR REL CONST PUB UNTYP. CODE 1408 BRACTICK REL CONST PUB UNTYP. CODE 1570 BUILDS REL CONST PUB UNTYP. CODE 1460 CACTL1 ABS CONST UNTYP. ASEG 59 CACTL2 ABS CONST UNTYP. ASEG 5A CALBC1_12MHZ ABS CONST UNTYP. ASEG 10FB CALBC1_16MHZ ABS CONST UNTYP. ASEG 10F9 CALBC1_1MHZ ABS CONST UNTYP. ASEG 10FF CALBC1_8MHZ ABS CONST UNTYP. ASEG 10FD CALDCO_12MHZ ABS CONST UNTYP. ASEG 10FA CALDCO_16MHZ ABS CONST UNTYP. ASEG 10F8 CALDCO_1MHZ ABS CONST UNTYP. ASEG 10FE CALDCO_8MHZ ABS CONST UNTYP. ASEG 10FC CAPD ABS CONST UNTYP. ASEG 5B CAPITALIZE REL CONST PUB UNTYP. CODE 116A CAPS REL CONST PUB UNTYP. CODE 9C0 CAPS1 REL CONST UNTYP. CODE 1180 CAPS2 REL CONST UNTYP. CODE 118E CCOMMA REL CONST PUB UNTYP. CODE FBE CCRC REL CONST PUB UNTYP. CODE 190A CELL REL CONST PUB UNTYP. CODE 80C CELLPLUS REL CONST PUB UNTYP. CODE 81A CELLS REL CONST PUB UNTYP. CODE 82A CEXIT REL CONST PUB UNTYP. CODE 8D0 CF430FRend REL CONST UNTYP. CODE 1D18 CFETCH REL CONST PUB UNTYP. CODE 224 CHARPLUS REL CONST PUB UNTYP. CODE 836 CHARR REL CONST PUB UNTYP. CODE 13F2 CHARS REL CONST PUB UNTYP. CODE 842 CMOVE REL CONST PUB UNTYP. CODE 6AC CMOVEUP REL CONST PUB UNTYP. CODE 6D0 CMOVE_1 REL CONST UNTYP. CODE 6B6 CMOVE_X REL CONST UNTYP. CODE 6C0 CMOVU_1 REL CONST UNTYP. CODE 6DE CMOVU_X REL CONST UNTYP. CODE 6EA COLD REL CONST PUB UNTYP. CODE 1A72 COLON REL CONST PUB UNTYP. CODE 154C COMMA REL CONST PUB UNTYP. CODE FA8 COMMABRANCH REL CONST PUB UNTYP. CODE 8E6 COMMACALL REL CONST PUB UNTYP. CODE 88C COMMACF REL CONST PUB UNTYP. CODE 874 COMMADEST REL CONST PUB UNTYP. CODE 8F4 COMMAJMP REL CONST PUB UNTYP. CODE 8A0 COMMANONE REL CONST PUB UNTYP. CODE 91E COMMAXT REL CONST PUB UNTYP. CODE 85C CONSTANT REL CONST PUB UNTYP. CODE 7E COR REL CONST PUB UNTYP. CODE A56 CORPOWERON ABS CONST UNTYP. CODE 186 CORREST ABS CONST UNTYP. CODE 18E COUNT REL CONST PUB UNTYP. CODE C8E CR REL CONST PUB UNTYP. CODE CA0 CRC REL CONST PUB UNTYP. CODE 1970 CREATE REL CONST PUB UNTYP. CODE 1476 CSTORE REL CONST PUB UNTYP. CODE 232 DABS REL CONST PUB UNTYP. CODE AEC DCOCTL ABS CONST UNTYP. ASEG 56 DDP REL CONST PUB UNTYP. CODE 95C DECIMAL REL CONST PUB UNTYP. CODE F60 DEPTH REL CONST PUB UNTYP. CODE 1752 DIGITQ REL CONST PUB UNTYP. CODE 11BA DIV1 REL CONST UNTYP. CODE 65A DIV2 REL CONST UNTYP. CODE 660 DIV3 REL CONST UNTYP. CODE 674 DIV4 REL CONST UNTYP. CODE 676 DIVIDE REL CONST UNTYP. CODE 654 DNEG1 REL CONST UNTYP. CODE AE2 DNEGATE REL CONST PUB UNTYP. CODE ABA DO REL CONST PUB UNTYP. CODE 168C DOALIAS REL CONST PUB UNTYP. CODE BE DOCODE REL CONST UNTYP. CODE Not solved DOCOLON REL CONST PUB UNTYP. CODE 54 DOCON REL CONST PUB UNTYP. CODE 86 DOES REL CONST PUB UNTYP. CODE 14AA DOROM REL CONST PUB UNTYP. CODE 92 DOT REL CONST PUB UNTYP. CODE F3C DOTCOLD REL CONST PUB UNTYP. CODE 1A5C DOTQUOTE REL CONST PUB UNTYP. CODE E08 DOTS REL CONST PUB UNTYP. CODE 18C2 DOTS1 REL CONST UNTYP. CODE 18F2 DOTS2 REL CONST UNTYP. CODE 1900 DOTSTATUS REL CONST PUB UNTYP. CODE 133E DOTVER REL CONST PUB UNTYP. CODE 1B02 DOTWOCON REL CONST PUB UNTYP. CODE 1AD8 DOUSER REL CONST PUB UNTYP. CODE AE DOVAR REL CONST PUB UNTYP. CODE 86 DROP REL CONST PUB UNTYP. CODE 104 DTOI REL CONST PUB UNTYP. CODE 34C DTOI_BYTE REL CONST UNTYP. CODE 37E DTOI_END REL CONST UNTYP. CODE 384 DTOI_LOOP REL CONST UNTYP. CODE 356 DTOI_WORD REL CONST UNTYP. CODE 36C DTOI_X REL CONST UNTYP. CODE 396 DUMP REL CONST PUB UNTYP. CODE 1856 DUP REL CONST PUB UNTYP. CODE DE ELSS REL CONST PUB UNTYP. CODE 15E6 EMIT REL CONST PUB UNTYP. CODE 77E EMITLOOP REL CONST UNTYP. CODE 780 ENDLOOP REL CONST PUB UNTYP. CODE 16A8 ENVIRONMENTQ REL CONST PUB UNTYP. CODE 1770 EQUAL REL CONST PUB UNTYP. CODE 4E8 ESC0 REL CONST UNTYP. CODE 1B91 ESC1 REL CONST UNTYP. CODE 1B94 ESCPAR REL CONST PUB UNTYP. CODE 1B30 EVALUATE REL CONST PUB UNTYP. CODE 131C EXECUTE REL CONST PUB UNTYP. CODE 26 EXIT REL CONST PUB UNTYP. CODE 4C FACTORY REL CONST PUB UNTYP. CODE 1A90 FACTORYIP REL CONST PUB UNTYP. CODE 1A92 FCTL1 ABS CONST UNTYP. ASEG 128 FCTL2 ABS CONST UNTYP. ASEG 12A FCTL3 ABS CONST UNTYP. ASEG 12C FETCH REL CONST PUB UNTYP. CODE 204 FILL REL CONST PUB UNTYP. CODE 688 FILL_1 REL CONST UNTYP. CODE 692 FILL_X REL CONST UNTYP. CODE 69C FIND REL CONST PUB UNTYP. CODE 110A FIND1 REL CONST UNTYP. CODE 1110 FIND2 REL CONST UNTYP. CODE 1128 FIND3 REL CONST UNTYP. CODE 1146 FLALIGNED REL CONST PUB UNTYP. CODE 1792 FLERASE REL CONST PUB UNTYP. CODE 24C FLE_1 REL CONST UNTYP. CODE 252 FLE_INFO REL CONST UNTYP. CODE 262 FLE_OK REL CONST UNTYP. CODE 26E FLE_X REL CONST UNTYP. CODE 2A4 FL_INFO REL CONST UNTYP. CODE 29E FMMOD1 REL CONST UNTYP. CODE B70 FMSLASHMOD REL CONST PUB UNTYP. CODE B4A GREATER REL CONST PUB UNTYP. CODE 51E HEADR REL CONST PUB UNTYP. CODE 1432 HERE REL CONST PUB UNTYP. CODE F88 HEX REL CONST PUB UNTYP. CODE F74 HIDE REL CONST PUB UNTYP. CODE 14FC HOLD REL CONST PUB UNTYP. CODE E80 HP REL CONST PUB UNTYP. CODE 984 IALLOT REL CONST PUB UNTYP. CODE FEA ICCOMMA REL CONST PUB UNTYP. CODE 1010 ICOMMA REL CONST PUB UNTYP. CODE FF8 ICSTORE REL CONST PUB UNTYP. CODE 302 ICST_INFO REL CONST UNTYP. CODE 316 ICST_OK REL CONST UNTYP. CODE 322 ICST_RAM REL CONST UNTYP. CODE 330 IDP REL CONST PUB UNTYP. CODE 99A IE1 ABS CONST UNTYP. ASEG 0 IE2 ABS CONST UNTYP. ASEG 1 IFF REL CONST PUB UNTYP. CODE 15BE IFG1 ABS CONST UNTYP. ASEG 2 IFG2 ABS CONST UNTYP. ASEG 3 IHERE REL CONST PUB UNTYP. CODE FD8 II REL CONST PUB UNTYP. CODE 5DA IMMEDIATE REL CONST PUB UNTYP. CODE 1536 IMMEDQ REL CONST PUB UNTYP. CODE 10F2 INFOB REL CONST PUB UNTYP. CODE A64 INTER1 REL CONST UNTYP. CODE 12BE INTER2 REL CONST UNTYP. CODE 12E8 INTER3 REL CONST UNTYP. CODE 12EA INTER4 REL CONST UNTYP. CODE 12EE INTER5 REL CONST UNTYP. CODE 12FA INTER6 REL CONST UNTYP. CODE 1308 INTER8 REL CONST UNTYP. CODE 1308 INTER9 REL CONST UNTYP. CODE 130C INTERPRET REL CONST PUB UNTYP. CODE 12B2 INVERT REL CONST PUB UNTYP. CODE 41C ISQUOTE REL CONST PUB UNTYP. CODE DEA ISTORE REL CONST PUB UNTYP. CODE 2B0 IST_INFO REL CONST UNTYP. CODE 2C8 IST_OK REL CONST UNTYP. CODE 2D4 IST_RAM REL CONST UNTYP. CODE 2E2 IST_X REL CONST UNTYP. CODE 2F4 ITHERE REL CONST PUB UNTYP. CODE 1986 ITOD REL CONST PUB UNTYP. CODE 6F8 IWORD REL CONST PUB UNTYP. CODE E1E IWORD1 REL CONST UNTYP. CODE E22 IWORDC REL CONST PUB UNTYP. CODE E30 JJ REL CONST PUB UNTYP. CODE 5F0 KEY REL CONST PUB UNTYP. CODE 798 KEYLOOP REL CONST UNTYP. CODE 79A KEYQ REL CONST PUB UNTYP. CODE 7B6 L$002 REL CONST UNTYP. CODE 62A L$01 REL CONST UNTYP. CODE 632 L0 REL CONST PUB UNTYP. CODE 9D6 LATEST REL CONST PUB UNTYP. CODE 97A LDUMP1 REL CONST UNTYP. CODE 1860 LDUMP2 REL CONST UNTYP. CODE 187A LDUMP3 REL CONST UNTYP. CODE 1898 LEAV REL CONST PUB UNTYP. CODE 16EE LEFTBRACKET REL CONST PUB UNTYP. CODE 14D8 LESS REL CONST PUB UNTYP. CODE 50A LESSNUM REL CONST PUB UNTYP. CODE E98 LFROM REL CONST PUB UNTYP. CODE 1674 LITER1 REL CONST UNTYP. CODE 11AE LITERAL REL CONST PUB UNTYP. CODE 119C LOO REL CONST PUB UNTYP. CODE 16C6 LOOP1 REL CONST UNTYP. CODE 16AE LOOP2 REL CONST UNTYP. CODE 16BC LP REL CONST PUB UNTYP. CODE 98E LSHIFT REL CONST PUB UNTYP. CODE 488 LSH_1 REL CONST UNTYP. CODE 492 LSH_X REL CONST UNTYP. CODE 498 LSTACK ABS CONST EXT [003] UNTYP. __EXTERNS Solved Extern MACU REL CONST UNTYP. CODE 626 MARKER REL CONST PUB UNTYP. CODE 17B0 MAX REL CONST PUB UNTYP. CODE BE2 MAX1 REL CONST UNTYP. CODE BEE MEM REL CONST PUB UNTYP. CODE 1C9C MEMBOT REL CONST PUB UNTYP. CODE 1C82 MEMTOP REL CONST PUB UNTYP. CODE 1C90 MIN REL CONST PUB UNTYP. CODE BFA MIN1 REL CONST UNTYP. CODE C06 MINUS REL CONST PUB UNTYP. CODE 3D8 MODD REL CONST PUB UNTYP. CODE BAE MOVE REL CONST PUB UNTYP. CODE 1726 MOVE1 REL CONST UNTYP. CODE 1742 MOVE2 REL CONST UNTYP. CODE 1746 MPLUS REL CONST PUB UNTYP. CODE 3C2 MPYU REL CONST UNTYP. CODE 622 MS REL CONST PUB UNTYP. CODE 1BDC MSTAR REL CONST PUB UNTYP. CODE AFA NEGATE REL CONST PUB UNTYP. CODE 42E NEQUAL REL CONST PUB UNTYP. CODE 774 NEWEST REL CONST PUB UNTYP. CODE 9A8 NFATOCFA REL CONST PUB UNTYP. CODE 10D8 NFATOLFA REL CONST PUB UNTYP. CODE 10C2 NINIT REL CONST PUB UNTYP. CODE A4A NIP REL CONST PUB UNTYP. CODE 15E NODUP REL CONST UNTYP. CODE F8 NOOP REL CONST PUB UNTYP. CODE 1780 NOTEQUAL REL CONST PUB UNTYP. CODE 4FC NUM REL CONST PUB UNTYP. CODE ECC NUMGREATER REL CONST PUB UNTYP. CODE EF8 NUMS REL CONST PUB UNTYP. CODE EE2 NUMS1 REL CONST UNTYP. CODE EE4 ONEMINUS REL CONST PUB UNTYP. CODE 44C ONEMS REL CONST PUB UNTYP. CODE 1BBA ONEPLUS REL CONST PUB UNTYP. CODE 43E ORR REL CONST PUB UNTYP. CODE 3FA OVER REL CONST PUB UNTYP. CODE 12A P1 REL CONST PUB UNTYP. CODE 1CC4 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 1CCE 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 1CD8 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 9CC PADAREA ABS CONST EXT [002] UNTYP. __EXTERNS Solved Extern PAGEE REL CONST PUB UNTYP. CODE 1B8A PAREN REL CONST PUB UNTYP. CODE 141C PCRC REL CONST PUB UNTYP. CODE 1946 PLUS REL CONST PUB UNTYP. CODE 3A2 PLUSLOOP REL CONST PUB UNTYP. CODE 16DA PLUSSTORE REL CONST PUB UNTYP. CODE 3B0 PN REL CONST PUB UNTYP. CODE 1B40 POST1 REL CONST UNTYP. CODE 15B4 POST2 REL CONST UNTYP. CODE 15B6 POSTPONE REL CONST PUB UNTYP. CODE 158A PROMPT REL CONST PUB UNTYP. CODE 134A PROMPT1 REL CONST UNTYP. CODE 135E PSTACK ABS CONST EXT [004] UNTYP. __EXTERNS Solved Extern PUSHTOS REL CONST UNTYP. CODE E0 QABO1 REL CONST UNTYP. CODE 13B6 QABORT REL CONST PUB UNTYP. CODE 13AA QDNEGATE REL CONST PUB UNTYP. CODE AD8 QDUP REL CONST PUB UNTYP. CODE F2 QNEG1 REL CONST UNTYP. CODE A9C QNEGATE REL CONST PUB UNTYP. CODE A92 QNUM1 REL CONST UNTYP. CODE 1292 QNUM2 REL CONST UNTYP. CODE 129E QNUM3 REL CONST UNTYP. CODE 12A2 QNUMBER REL CONST PUB UNTYP. CODE 126E QSIGN REL CONST PUB UNTYP. CODE 11F6 QSIGN1 REL CONST UNTYP. CODE 1220 QUIT REL CONST PUB UNTYP. CODE 1368 QUIT1 REL CONST UNTYP. CODE 137A QUITIP REL CONST PUB UNTYP. CODE 136A RAMDICT ABS CONST EXT [007] UNTYP. __EXTERNS Solved Extern RECURSE REL CONST PUB UNTYP. CODE 14C6 REPEAT REL CONST PUB UNTYP. CODE 1650 REVEAL REL CONST PUB UNTYP. CODE 151C RFETCH REL CONST PUB UNTYP. CODE 190 RFROM REL CONST PUB UNTYP. CODE 17C RIGHTBRACKET REL CONST PUB UNTYP. CODE 14E8 ROMDICT ABS CONST EXT [-001] UNTYP. __EXTERNS Solved Extern ROT REL CONST PUB UNTYP. CODE 142 RPFETCH REL CONST PUB UNTYP. CODE 1CE RPSTORE REL CONST PUB UNTYP. CODE 1E4 RSHIFT REL CONST PUB UNTYP. CODE 4A8 RSH_1 REL CONST UNTYP. CODE 4B2 RSH_X REL CONST UNTYP. CODE 4BA RSTACK ABS CONST EXT [005] UNTYP. __EXTERNS Solved Extern RZERO REL CONST PUB UNTYP. CODE 9E0 S0 REL CONST PUB UNTYP. CODE 9EA S2 REL CONST PUB UNTYP. CODE 1D00 SAVE REL CONST PUB UNTYP. CODE 19EC SCAN REL CONST PUB UNTYP. CODE 728 SCAN_1 REL CONST UNTYP. CODE 732 SCAN_X REL CONST UNTYP. CODE 73C SEMICOLON REL CONST PUB UNTYP. CODE 155E SEMIPN REL CONST PUB UNTYP. CODE 1B54 SEQUAL REL CONST PUB UNTYP. CODE 74C SEQU_1 REL CONST UNTYP. CODE 756 SEQU_X REL CONST UNTYP. CODE 76A SIGN REL CONST PUB UNTYP. CODE F10 SIGN1 REL CONST UNTYP. CODE F1E SKIP REL CONST PUB UNTYP. CODE 702 SKIP_1 REL CONST UNTYP. CODE 70C SKIP_X REL CONST UNTYP. CODE 716 SLASH REL CONST PUB UNTYP. CODE B9E SLASHMOD REL CONST PUB UNTYP. CODE B8C SLASHSTRING REL CONST PUB UNTYP. CODE 103E SMISMATCH REL CONST UNTYP. CODE 764 SMSLASHREM REL CONST PUB UNTYP. CODE B1C SOURCE REL CONST PUB UNTYP. CODE 102A SPACE REL CONST PUB UNTYP. CODE CBA SPACES REL CONST PUB UNTYP. CODE CCC SPCS1 REL CONST UNTYP. CODE CCE SPCS2 REL CONST UNTYP. CODE CDC SPFETCH REL CONST PUB UNTYP. CODE 1A6 SPSTORE REL CONST PUB UNTYP. CODE 1BC SQEST REL CONST PUB UNTYP. CODE 1D0E SSMOD REL CONST PUB UNTYP. CODE BC0 STAR REL CONST PUB UNTYP. CODE B7C STARSLASH REL CONST PUB UNTYP. CODE BD2 STATE REL CONST PUB UNTYP. CODE 952 STOD REL CONST PUB UNTYP. CODE A7E STORCOLON REL CONST PUB UNTYP. CODE 8B6 STORE REL CONST PUB UNTYP. CODE 212 STORECF REL CONST PUB UNTYP. CODE 868 STOREDEST REL CONST PUB UNTYP. CODE 908 SWAP REL CONST PUB UNTYP. CODE 114 SWAPBYTES REL CONST PUB UNTYP. CODE 45A TA0CCR0 ABS CONST UNTYP. ASEG 172 TA0CCR1 ABS CONST UNTYP. ASEG 174 TA0CCR2 ABS CONST UNTYP. ASEG 176 TA0CCTL0 ABS CONST UNTYP. ASEG 162 TA0CCTL1 ABS CONST UNTYP. ASEG 164 TA0CCTL2 ABS CONST UNTYP. ASEG 166 TA0CTL ABS CONST UNTYP. ASEG 160 TA0IV ABS CONST UNTYP. ASEG 12E TA0R ABS CONST UNTYP. ASEG 170 TA1CCR0 ABS CONST UNTYP. ASEG 192 TA1CCR1 ABS CONST UNTYP. ASEG 194 TA1CCR2 ABS CONST UNTYP. ASEG 196 TA1CCTL0 ABS CONST UNTYP. ASEG 182 TA1CCTL1 ABS CONST UNTYP. ASEG 184 TA1CCTL2 ABS CONST UNTYP. ASEG 186 TA1CTL ABS CONST UNTYP. ASEG 180 TA1IV ABS CONST UNTYP. ASEG 11E TA1R ABS CONST UNTYP. ASEG 190 THEN REL CONST PUB UNTYP. CODE 15D4 TIB REL CONST PUB UNTYP. CODE 9F6 TIBAREA ABS CONST EXT [006] UNTYP. __EXTERNS Solved Extern TIBSIZE REL CONST PUB UNTYP. CODE A06 TIB_SIZE ABS CONST EXT [008] UNTYP. __EXTERNS Solved Extern TICK REL CONST PUB UNTYP. CODE 13D6 TICKSOURCE REL CONST PUB UNTYP. CODE 96C TOBODY REL CONST PUB UNTYP. CODE 84E TOCOUNTED REL CONST PUB UNTYP. CODE 105A TODIGIT REL CONST PUB UNTYP. CODE EAC TOIN REL CONST PUB UNTYP. CODE 938 TOL REL CONST PUB UNTYP. CODE 165E TONUM1 REL CONST UNTYP. CODE 1230 TONUM2 REL CONST UNTYP. CODE 1246 TONUM3 REL CONST UNTYP. CODE 1260 TONUMBER REL CONST PUB UNTYP. CODE 122E TOR REL CONST PUB UNTYP. CODE 16C TOSFALSE REL CONST UNTYP. CODE 4F0 TOSTRUE REL CONST UNTYP. CODE 512 TUCK REL CONST PUB UNTYP. CODE 1F6 TWOCONSTANT REL CONST PUB UNTYP. CODE 1ACE TWODROP REL CONST PUB UNTYP. CODE C3C TWODUP REL CONST PUB UNTYP. CODE C4C TWOFETCH REL CONST PUB UNTYP. CODE C10 TWOOVER REL CONST PUB UNTYP. CODE C74 TWOSLASH REL CONST PUB UNTYP. CODE 476 TWOSTAR REL CONST PUB UNTYP. CODE 468 TWOSTORE REL CONST PUB UNTYP. CODE C24 TWOSWAP REL CONST PUB UNTYP. CODE C5E TYP REL CONST PUB UNTYP. CODE D7A TYP3 REL CONST UNTYP. CODE D8A TYP4 REL CONST UNTYP. CODE D98 TYP5 REL CONST UNTYP. CODE D9A U0 REL CONST PUB UNTYP. CODE 92C UAREA ABS CONST EXT [001] UNTYP. __EXTERNS Solved Extern UAREA_SIZE ABS CONST EXT [009] UNTYP. __EXTERNS Solved Extern UCA0ABCTL ABS CONST UNTYP. ASEG 5D UCA0BR0 ABS CONST UNTYP. ASEG 62 UCA0BR1 ABS CONST UNTYP. ASEG 63 UCA0CTL0 ABS CONST UNTYP. ASEG 60 UCA0CTL1 ABS CONST UNTYP. ASEG 61 UCA0IRRCTL ABS CONST UNTYP. ASEG 5F UCA0IRTCTL ABS CONST UNTYP. ASEG 5E UCA0MCTL ABS CONST UNTYP. ASEG 64 UCA0RXBUF ABS CONST UNTYP. ASEG 66 UCA0STAT ABS CONST UNTYP. ASEG 65 UCA0TXBUF ABS CONST UNTYP. ASEG 67 UCB0BR0 ABS CONST UNTYP. ASEG 6A UCB0BR1 ABS CONST UNTYP. ASEG 6B UCB0CTL0 ABS CONST UNTYP. ASEG 68 UCB0CTL1 ABS CONST UNTYP. ASEG 69 UCB0I2CIE ABS CONST UNTYP. ASEG 6C UCB0I2COA ABS CONST UNTYP. ASEG 118 UCB0I2CSA ABS CONST UNTYP. ASEG 11A UCB0RXBUF ABS CONST UNTYP. ASEG 6E UCB0STAT ABS CONST UNTYP. ASEG 6D UCB0TXBUF ABS CONST UNTYP. ASEG 6F UDOT REL CONST PUB UNTYP. CODE F26 UDOTR REL CONST PUB UNTYP. CODE 1832 UDSLASHMOD REL CONST PUB UNTYP. CODE E44 UDSTAR REL CONST PUB UNTYP. CODE E62 UGREATER REL CONST PUB UNTYP. CODE 53C UINIT REL CONST PUB UNTYP. CODE A1E ULESS REL CONST PUB UNTYP. CODE 52C UMAX REL CONST PUB UNTYP. CODE D00 UMAX1 REL CONST UNTYP. CODE D0C UMIN REL CONST PUB UNTYP. CODE CE8 UMIN1 REL CONST UNTYP. CODE CF4 UMSLASHMOD REL CONST PUB UNTYP. CODE 64E UMSTAR REL CONST PUB UNTYP. CODE 61E UNLOOP REL CONST PUB UNTYP. CODE 60C UNTIL REL CONST PUB UNTYP. CODE 1612 UNUSED REL CONST PUB UNTYP. CODE 1CB2 UP ABS CONST EXT [000] UNTYP. __EXTERNS Solved Extern UPC REL CONST PUB UNTYP. CODE 1148 UPC1 REL CONST UNTYP. CODE 1162 USER REL CONST PUB UNTYP. CODE A6 VALIDQ REL CONST PUB UNTYP. CODE 19D6 VARIABLE REL CONST PUB UNTYP. CODE 68 WARM REL CONST PUB UNTYP. CODE 1A4E WDS1 REL CONST UNTYP. CODE 180C WDTCTL ABS CONST UNTYP. ASEG 120 WHILE REL CONST PUB UNTYP. CODE 163E WIPE REL CONST PUB UNTYP. CODE 1AA6 WITHIN REL CONST PUB UNTYP. CODE 170E WORD1 REL CONST UNTYP. CODE 1094 WORDD REL CONST PUB UNTYP. CODE 1070 WORDS REL CONST PUB UNTYP. CODE 1806 XDOES REL CONST PUB UNTYP. CODE 1492 XISQUOTE REL CONST PUB UNTYP. CODE DA6 XORR REL CONST PUB UNTYP. CODE 40A XSQUOTE REL CONST PUB UNTYP. CODE DBE ZERO REL CONST PUB UNTYP. CODE 7CE ZEROEQUAL REL CONST PUB UNTYP. CODE 4C6 ZEROLESS REL CONST PUB UNTYP. CODE 4D6 __MSP430G2203__ ABS CONST UNTYP. ASEG Not solved boot1 REL CONST UNTYP. CODE 1A44 bran REL CONST PUB UNTYP. CODE 54E cclr REL CONST PUB UNTYP. CODE 1C34 ccrc1 REL CONST UNTYP. CODE 191C cget REL CONST PUB UNTYP. CODE 1C64 cget1 REL CONST UNTYP. CODE 1C70 cget2 REL CONST UNTYP. CODE 1C72 cor ABS CONST EXT [010] UNTYP. __EXTERNS Solved Extern crcval ABS CONST EXT [013] UNTYP. __EXTERNS Solved Extern cset REL CONST PUB UNTYP. CODE 1C08 ctoggle REL CONST PUB UNTYP. CODE 1C4E dobran REL CONST UNTYP. CODE 550 docreate REL CONST PUB UNTYP. CODE 86 dodoes REL CONST PUB UNTYP. CODE C2 donext REL CONST UNTYP. CODE 7AA donoop REL CONST UNTYP. CODE 7AA dotcold0 REL CONST UNTYP. CODE 1A61 dotcold1 REL CONST UNTYP. CODE 1A66 green REL CONST PUB UNTYP. CODE 1CF4 ih1 REL CONST UNTYP. CODE 198A infoB ABS CONST EXT [011] UNTYP. __EXTERNS Solved Extern invalid REL CONST UNTYP. CODE 1A24 lastword REL CONST PUB UNTYP. CODE 1D09 link REL VAR UNTYP. CODE 1D09 lit REL CONST PUB UNTYP. CODE 36 ms1 REL CONST UNTYP. CODE 1BE2 nullirq ABS CONST EXT [-001] UNTYP. __EXTERNS Solved Extern onems1 REL CONST UNTYP. CODE 1BC4 onems2 REL CONST UNTYP. CODE 1BCC pcrc1 REL CONST UNTYP. CODE 1956 pcrc2 REL CONST UNTYP. CODE 1964 pcrc3 REL CONST UNTYP. CODE 1966 qbran REL CONST PUB UNTYP. CODE 562 red REL CONST PUB UNTYP. CODE 1CE4 reset REL CONST UNTYP. CODE 1A32 valid REL CONST UNTYP. CODE 1A22 ver0 REL CONST UNTYP. CODE 1 verend REL CONST UNTYP. CODE 1A version REL CONST UNTYP. CODE 0 warm0 REL CONST UNTYP. CODE 1A53 warm1 REL CONST UNTYP. CODE 1A58 wclr REL CONST PUB UNTYP. CODE 1C1E wipmsg0 REL CONST UNTYP. CODE 1AAB wipmsg1 REL CONST UNTYP. CODE 1AB2 wset REL CONST PUB UNTYP. CODE 1BF2 xdo REL CONST PUB UNTYP. CODE 578 xloop REL CONST PUB UNTYP. CODE 59E xplusloop REL CONST PUB UNTYP. CODE 5BE ############################## # CRC:8287 # # Errors: 0 # # Warnings: 0 # # Bytes: 7448 # ##############################