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