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